권한 상승을 하려고 구글링해보니, MS에 게시된 문서를 비롯해서 한국 MVP들이 올려 놓은 문서들을 찾았다. 실제로는 다 같은 이야기이나, 말을 좀 달리 했고, 약간의 추가된 내용이 있어, 다 참고하는 게 좋을 것 같다.
비스타 권한 상승 처리...
1. 권한 상승 모니커로 권한상승이 필요한 COM 모듈 실행
새로운 액티브엑스를 만들지 않고 기존 액티브엑스가 기존 액티브엑스를 호출하는 형태를 하고 싶었으나, 일단 실패. 되면, 3 으로 점프.
2. 권한 상승한 프로세스 실행
runas 로 실행하는 방법
이외에도 IE7 을 위해서
3. Trusted Site 로 등록
혹은 액티브 엑스 설치된 이후에는, codebase 없이 object 태그로 생성하거나 new ActivexObject( ProgID ) 형태로 ActiveX 호출하거나 ^^
codebase 가 잡혀있으면 실행을 하지 않는 경우가... -.-;
1,2 모두 UAC 경고창이 한번은 나온다 -.-; UAC 경고창이 안나오게 하는 방법은 제시하질 않았습니다.
참고
1. Trusted Site 등록 스크립트
Echo MICROSOFT INTERNET EXPLORER 7
Echo Adding Trusted site
Echo.
Echo Copyright (C) Microsoft Corporation. All rights reserved.
Echo.
set ProductName=Internet Explorer 7.0
set Trusetdsite=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\필요한 도메인 주소
set REGBlockValue=*
set REGBlockValue=http 혹은 https REG ADD "%Trusetdsite%" /v %REGBlockValue% /t REG_DWORD /d 2 /f
:End
NoRemove AppID
{
'{NEW APP GUID}' = s 'APP NAME'
{
val DllSurrogate = s ''
}
}
빨간 글씨는 임으로 넣을 것
4. 비스타에서 IE 돌아가는 경우 호출하는 ActiveX 의 DllRegisterServe 에서 처리할 것
// hKey 는 HKCR\AppID\{GUID}
// 이 함수를 이용하여 접근 권한을 설정할 수 있다.
BOOL SetAccessPermissions(HKEY hkey, PSECURITY_DESCRIPTOR pSD)
{
BOOL bResult = FALSE;
DWORD dwLen = GetSecurityDescriptorLength(pSD);
LONG lResult;
lResult = RegSetValueExA(hkey,
"AccessPermission",
0,
REG_BINARY,
(BYTE*)pSD,
dwLen);
if (lResult != ERROR_SUCCESS)
goto done;
bResult = TRUE;
done:
return bResult;
}
// 무결성 수준이 낮은 클라이언트들도 실행 혹은 활성화 할 수 있는 Security Descriptor를 가져온다.
BOOL GetLaunchActPermissionsWithIL (SECURITY_DESCRIPTOR **ppSD)
{
LPWSTR lpszSDDL = L"O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)";
if (ConvertStringSecurityDescriptorToSecurityDescriptorW(lpszSDDL, SDDL_REVISION_1, (PSECURITY_DESCRIPTOR *)&pSD, NULL))
{
*ppSD = pSD;
return TRUE;
}
}
// 위에서 GetLaunchActPermissionWithIL을 이용해서 얻어온 SD를 이용하여 COM 객체에
// 실행과 활성화 수준을 설정한다.
BOOL SetLaunchActPermissions(HKEY hkey, PSECURITY_DESCRIPTOR pSD)
{
BOOL bResult = FALSE;
DWORD dwLen = GetSecurityDescriptorLength(pSD);
LONG lResult;
lResult = RegSetValueExA(hkey,"LaunchPermission",0,REG_BINARY,(BYTE*)pSD,dwLen);
if (lResult != ERROR_SUCCESS) goto done;
bResult = TRUE;