천객만래 [千客萬來] (It has an interminable succession of visitors)

개요
XP에서 정상동작하던 ActiveX가 비스타 이상에서는 정상적으로 동작하지 않는 경우가 발생하였습니다. 원인은 비스타에서 강화된 보안의 영향으로 ActiveX에서 PC 주요 내부를 사용할 경우, 관리자 권한이 필요하게 되었는데, 일반적인 모드에서는 관리자 모드가 아니기 때문에, 관련 기능이 실패하여 발생한 문제였습니다.

다음은 비스타에서 일반적인 사용자 모드에서는 권한이 제한되는 기능들입니다.
  • Change files in Program Files folders
  • Change files in Windows or System32 folders
  • Change registry under HKLM\Software
  • Change the local machines date and time
  • Install or uninstall Services
  • Register COM Server (globally)
이를 해결하기 위해서는 UAC(User Account Control)를 이용하여 관리자 권한을 획득하여야 합니다. ActiveX에서 관리자 권한을 획득하기 위해서는 반드시 필요한 조건들이 있습니다.

  1. 클래스 아이디 키 아래에 LocalizedString 이름이 존재하고, 값으로 ActiveX 실행 모듈 경로가 들어 있어야 함
  2. 실행 모듈에 LocalizedString 에서 지정한 리소스 ID에 해당하는 문자열(모듈명)이 존재해야 함
  3. 클래스 아이디 키 아래에 AppId 이름이 존재하고, 클래스 아이디 값이 들어 있어야 함
  4. 클래스 아이디 키 아래에 Evevation Key가 존재하고, Enabled(DWORD) 값이 1이어야 함


ActiveX에서 UAC를 통한 관리자 권한 획득 방법
아래 참고 자료중에 "비스타에서 델파이를 이용한 ActiveX 권한 상승(UAC)"에서 소스를 받으시고, uActiveXElevation.pas과 uActiveXElevationFactory.pas를 기존 ActiveX 프로젝트에 추가합니다.

uActiveXElevationFactory 소스를 잠시 분석해 보면, 위 그림과 같은 레지스트리를 설치시 자동으로 등록하기 위하여 UpdateRegistry 메소드를 override하여 처리하고 있습니다.

기존 ActiveX 구현(impl) 소스에서 uActiveXElevationFactory 유닛을 추가하시고, 소스 마지막 부분에 있는 Factory 를 TActiveFormElevationFactory 클래스로 변경해 줍니다.
  TActiveFormElevationFactory.Create(
    ComServer,
    TActiveFormControl,
    TDelphiZzangX,
    Class_DelphiZzangX,
    1,
    '',
    OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
    tmApartment);

Type Library에서 권환 획득을 위한 Evevation 메소드를 추가하고, 반환값을 설정합니다.

Evevation 메소드 구현부에서 uActiveXElevation 유닛의 CoCreateInstanceAsAdmin 메소드를 활용하여 관리자 권한으로 실행된 ActiveX를 반환하도록 합니다.
function TDelphiZzangXElevator.ElevateDelphiZzang: OleVariant;
var
  FCOMObject : IDelphiZzangX;
begin
  OleCheck(CoCreateInstanceAsAdmin(Self.Handle, CLASS_DelphiZzangX, IID_IDelphiZzangX, FCOMObject));
  result := FCOMObject;
end;
아래와 같은 StringTable 리소스를 작성합니다.
STRINGTABLE
{
2007, "델파이 ActiveX Sample"
}

위에서 작성한 리소스가 ActiveX 모듈에 포함되도록 합니다. 프로젝트 소스에 다음과 같은 라인을 추가합니다.
{$R 'StringTable.res' 'StringTable.rc'}

ActiveX를 빌드하고, ActiveX 인증서로 서명을 합니다.

캐비넷 파일(CAB)를 생성하고 ActiveX 인증서로 서명을 합니다.


비스타에서 권한 상승을 통한 ActiveX 메소드 실행 예
다음과 같이 자바스크립트를 작성하여 ActiveX의 Elevation 메소드를 호출한 결과 객체로 필요한 기능을 수행합니다.


위 메소드를 호출한 결과 UAC 권한 요청창이 아래와 같이 나타납니다.


위와 같은 방식으로 작성한 ActiveX에서 Evevation 메소드를 호출하면 위와 같은 UAC창이 나타나고, 사용자가 "허용"을 선택하면 관리자 권한으로 ActiveX가 실행이되어 동작이 원활하게 됩니다.


결론
이상으로 비스타에서 UAC를 이용하여 ActiveX가 관리자 권한을 획득하여 실행하는 과정과 실행 화면을 보았습니다. 약간 복잡하지만, UAC는 비스타의 모든 부분에 영향을 미치는 것으로 이미 개발되어 있는 풀그림 및 ActiveX 모듈은 이를 고려하여 다시 작성할 필요가 있습니다.


참고자료

출처 : http://hbesthee.tistory.com/620?srchid=BR1http%3A%2F%2Fhbesthee.tistory.com%2F620

고맙습니다. 공부하는데 참고하겠습니다.

Posted by SB패밀리

강화된 비스타의 사용자 계정관리 컨트롤



비스타 사용시 UAC 창이 뜰 때가 많다.
시스템 영역을 사용하거나 관리자 권한으로 올릴 필요가 있을 경우에
이 화면이 뜨며 동시에 화면 깜빡임 현상이 나타난다.

이것은 보안정책에 관련된 부분이다.

단지 화면 깜빡임 현상을 해소하기 위해서는
아래의 2가지가 존재한다.

1. 로컬 보안 정책을 이용하여 변경하는 방법 ( 비스타 비즈니스, 비스타 얼티메이트 )
.실행(윈도우키+r) -> secpol.msc 입력하여 로컬 보안 정책 실행
.로컬정책 > 보안옵션 선택
.사용자 계정 컨트롤: 권한 상승시 보안 데스크탑으로 전환을 '사용안함'으로 설정

혹은

제어판>관리도구>로컬 보안 정책에서 가능하다.

2. 레지스트리를 수정하는 방법 ( 비스타 홈 베이직, 비스타 홈 프리미엄 )
.컴퓨터\HKEY_LOCALMACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 항목을 찾아 다음 항목을 고친다.
.PromptOnSecureDesktop 항목을 값을 기존 1 에서 0 으로 고치고 확인 버튼을 클릭한다.

어떠한 방법을 사용해도 되지만 난 비스타 홈 프리미엄이라.. 선택의 여지없이 1번을 사용하였다.

위의 설정은 화면 깜빡임을 사라지게 할 뿐, 여전히 사용자 계정 컨트롤의 권한 확인 창은 나타난다. UAC 기능을 아예 막아버려 .. 권한 확인 창이 아예 보이지 않도록 하려면 다음의 글을 참조하라.


UAC 설정을 끄는 방법


방법 1 - 사용자 계정 컨트롤을 통하는 방법

  1. [시작]을 클릭하여 [제어판]을 엽니다.

  2. [제어판]의 [제어판 홈]보기에서 [사용자 계정 및 가족 보호]를 클릭합니다.  

  3. [사용자 계정]을 클릭합니다.

  4. 하단의 [사용자 계정 추가 및 제거]를 클릭합니다.

  5. 허가가 필요하다는 프롬프트에 대하여 [계속] 단추를 눌러 관리자 [암호]를 입력합니다.  

  6. [사용자 계정 컨트롤을 사용하여컴퓨터를 보다 안전하게 보호]의 체크 설정을 해제합니다.

  7. [확인] 단추를 누릅니다.

  8. 변경된 설정의 적용을 위하여 시스템의 재부팅이 필요합니다.

  9. 설정을 원 상태로 복구하기 위해서는 체크 설정을 다시 합니다.


방법 2 - 레지스트리 편집을 통하는 방법

  1. [시작]의 검색 텍스트 입력창에 'regedit'를 타자한 후 엔터 키를 눌러 [레지스트리 편집기]를 기동합니다.

  2. 다음의 레지스트리 분기점까지 찾아갑니다.

    HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System

  3. 컴퓨터를 재시작합니다.

  4. UAC를 다시 [Enable]로 설정하려면 변경된 EnableLUA의 [값 데이터]를 '1'로 변경합니다.


방법 3 - [시스템 구성 유틸리티]를 통한 방법

  1. [시작]의 검색 텍스트 입력창에 'msconfig'를 타자 후 엔터키를 눌러 [시스템 구성 유틸리티]를 기동합니다.

  2. 허가 요청에 대하여 [계속]을 눌러 답하거나 또는 관리자의 [암호]를 입력합니다.

  3. [도구] 탭을 누릅니다.

  4. 스크롤바를 내려 [Disable UAP] 또는 [Disable UAC] 옵션 항목을 찾아 하이라이트합니다.

  5. 하단의 [Launch] 단추를 누릅니다.

  6. 명령 프롬프트 창이 열리며, UAC를 사용 안 함으로 하기 위한 스크립트 프로세스가 자동으로 실행됩니다.

  7. 작업이 성공적으로 완성되었다는 요지의 메시지가 나타납니다.

  8. CMD 창을 닫고 시스템 구성 유틸리티를 종료합니다.

  9. 시스템을 재시작하여 변경을 시스템에 적용합니다.

  10. 원상 복구는 [Enable UAP] 또는 [Ensable UAC]을 선택하여 런칭 단추를 누릅니다.


방법 4 - 그룹 정책 편집을 통한 방법

  1. 주의 : Windows Vista Home Premium 그리고 Home Basic 에디션에는 그룹 정책 편집기가 없습니다.

  2. [시작]의 검색 텍스트 입력창에 'GPedit.msc'를 타자한 후 엔터 키를 눌러 [그룹 정책 편집기]를 엽니다.

  3. [컴퓨터 구성]-[Windows 설정]-[보안 설정]-[로컬 정책]-[보안 옵션]으로 찾아 갑니다.

  4. 우측의 상세 창에는 몇 User Account Control 정책들이 있습니다.

  5. 아래 정책들을 마우스 우클릭하여 '-' 다음의 새로운 값으로 구성 또는 변경합니다.

    • User Account Control: Behavior of the elevation prompt for administrators - Elevate without prompting

    • User Account Control: Detect application installations and prompt for elevation - Disabled

    • User Account Control: Run all administrators in Admin Approval Mode - Disabled

  6. 컴퓨터를 재시작합니다.

  7. 복구를 위해서는 정책의 원래의 값인 'Enable' 또는 'Prompt for Consent'를 되돌려 줍니다.


방법 5 - 명령 프롬프트를 통하는 방법

  1. 상승된 권한의 명령 프롬프트를 엽니다.

  2. UAC를 Disable로 설정키 위하여 아래 명령을 실행합니다.

    C:\Windows\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f

  3. 다시 UAC 기능을 되살리는 명령은 다음과 같습니다.

    C:\Windows\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 1 /f

  4. 컴퓨터를 재시작하여 적용되도록 합니다.

  5. 주의 : UAC를 사용치 않는 것으로 설정하면 작업 표시줄의 알림 영역에 빨간 색의 'X' 방패 아이콘인 [Windows Security Center]의 아이콘이 표시되며, 이 경고 아이콘을 작업 표시줄에서 제거하려면 아래 기사를 참조합니다.

Posted by SB패밀리