2010-03-13 2 views
0

나는 서비스를 구성하는 데 사용 관리 명령 세트에 대한 LocalServer32 여기서 COM 인터페이스를 노출하는 ATL로 만든 Windows 서비스가 있고, 이러한 예를 들어 VBScript를에서 사용할 수 있습니다 : 나는 해봐요 실행할자동화에 사용되는 COM 인터페이스를 어떻게 자동으로 올릴 수 있습니까?

Set myObj = WScript.CreateObject("MySvc.Administrator") 
myObj.DoSomething() 

VBScript가 호출 될 때 UAC 프롬프트가 자동으로 나타나기를 바랍니다. 이것이 가능한가?

은 내가 상승 된 명령 쉘에서 스크립트를 실행할 수 있습니다 알고, 내가 사용할 수있는

objShell.ShellExecute WScript.FullName, 대하 (34) & WScript.ScriptFullName & 대하 (34), 워드 vb N ull " runas "

예를 들어 VBScript 자체를 높게 실행하면 그 중 하나가 정상적으로 작동합니다. COM 메서드는 자체적으로 상승합니다.

그러나 AFAIK는 데스크톱에서 상승 된 탐색기 창을 가져옵니다. 실제로 시작/보조 프로그램/Windows 탐색기/관리자 권한으로 실행을 마우스 오른쪽 단추로 클릭하는 것만 큼 간단하지는 않습니다. 실제로는 향상되지 않거나 적어도 COM 메서드는 자체적으로 상승하지 않습니다.) 로컬 관리 그룹의 사용자가 파일과 폴더를 스크립트로 끌어다 놓을 수있게하고 스크립트가 인수로 해당 경로 이름을 사용하여 관리 COM 인터페이스를 호출하도록합니다. COM 방법을 높일 수 있습니다. (그리고 나는 args로 원숭이를 돌리고 ShellExecute "runas"를 사용하는 것보다 더 단순하게하기를 바라고 있습니다.)

서비스 EXE 매니페스트의 requireAdministrator에 대해 UAC 실행 수준을 설정하고 Elevated/Enabled = 1로 설정해 보았습니다. MySvc.Administrator 클래스의 레지스트리에서 LocalizedString을 사용하면 트릭을 수행하지 않습니다.

편집 : 나는 COM 방법 자체가 상승 발견 썼다

가, 내가 정말로 의미하는 것은 들어오는 COM 요청의 보안 토큰은이 관리자에서 온 것을 알 수 있었다. 이 토큰을 검사하여 요청이 허용되는지 확인합니다. COM 개체가있는 Windows 서비스 프로세스는 LocalSystem으로 실행 중일 수 있습니다.

답변

0

내 자신의 질문에 대답하려면 예, 내 서비스의 자동화 인터페이스에 액세스하는 vbscript에서 UAC 대화 상자를 즉석으로 표시 할 수 있습니까?

내가 갖고있는 것은 vbscript가 액세스 할 수 있도록 관리 인터페이스를 제공하는 Windows 서비스의 클래스입니다. 해당 인터페이스는 사용자가 서비스를 수락하기 전에 서비스를 수정할 수있는 권한이 있는지 확인합니다. Vista 및 Server 2008에서 일어나는 일은 관리자 보안 토큰을 사용하여 승격 된 프로세스에 있지 않으면 제한된 보안 토큰으로 실행되므로 서비스 인터페이스는 사용자가 수행 할 수 없도록합니다.

UAC 대화 상자가 나타나서 서비스로가는 길을 따라 가려면 클래스에 똑같은 관리자 인터페이스를두고 새로운 vbscript를 통해 사용할 수있게하는 새로운 COM 서버 (EXE)를 만들었습니다. 오토메이션. 해당 COM 개체에 작업을 요청하면 서비스로 전환되고 서비스 COM 개체의 인스턴스가 만들어지고 요청에 전달할 프록시 역할을하는 똑같은 작업이 수행됩니다.

이 새 COM 서버는 COM Elevation Moniker msdn link을 사용하여 고도를 설정할 수 있도록 레지스트리에 주석으로 표시됩니다.

그런 다음 vbscript에서 CreateObject() 대신 GetObject ("Elevation : Administrator! new :)를 호출 할 수 있습니다.이 시점에서 COM 개체를 만들면 UAC 대화 상자가 나타나서 해당 개체가 시작됩니다 관리자 인터페이스에 액세스해야 할 때 UAC 대화 상자에 원하는 표시 문자열 (및 선택적으로 아이콘)이 표시되고 서비스 호출로 관리자 권한이 표시됩니다.

상승 된 COM 개체에서 관리자 권한을 유지하려면 차례로 Windows 서비스 COM 개체로 호출 할 때 SetBlanket을 호출하여 연결 호출에서 클로킹을 사용합니다. 여기에 훌륭한 정보가 있습니다. : Client-Side Security Programming.

0

VBScript는 스크립팅 호스팅 프로세스에서 호스팅되므로 스크립트는 Windows 스크립팅 호스트의 보안 컨텍스트를 "상속합니다". 호스팅 프로세스가 스크립트보다 높은 권한을 가진 경우 단일 인터페이스 또는 단일 메서드 호출을 호스팅 프로세스의 보안 컨텍스트 외부로 승격시키는 방법은 없습니다.

또 하나주의해야 할 점은 승격되지 않은 프로세스가 승격 된 프로세스를 생성 할 때 UAC는 항상 확인을 표시한다는 것입니다. 따라서 승격되지 않은 탐색기가 스크립트에서 "runas"를 수행하면 사용자가 확인해야합니다. 비 승격 스크립트가 "runas"를 수행 할 때 사용자는이를 확인해야합니다.

+0

* 기존 * 프로세스를 높일 수는 없지만 * 새로운 * 프로세스 만 상승시킬 수 있습니까? 그렇다면 이해가됩니다. –

+0

VBScript의 GetObject 호출에서 COM Elevation Moniker를 사용하면 스크립트 프로세스를 향상시키지 않고도 COM 개체를 상승 된 프로세스로 인스턴스화 할 수 있습니다. 원하는대로 처리 할 수 ​​있습니다. 단지 DoSomething을 높여야 만합니다. 스크립트. –

+0

나쁘지 않습니다! 나는이 별명을 전혀 알지 못했다. out-of-proc이기 때문에 COM 서버는 별도의 승격 된 프로세스이므로, 적어도 나는 당신을 오해했습니다 :-)) – wqw

관련 문제