프로그래밍/델파이

비스타(Vista)에서 ActiveX UAC 관련 문제

채윤아빠 2009. 7. 8. 22:24
728x90
반응형



개요
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 모듈은 이를 고려하여 다시 작성할 필요가 있습니다.


참고자료