如何自动提升用于自动化的COM接口?

时间:2010-03-13 19:44:34

标签: windows com uac

我有一个使用ATL构建的Windows服务,用于为一组用于配置服务的管理命令公开LocalServer32 COM接口,这些可以在VBScript中使用,例如:

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

我希望DoSomething运行提升,我希望UBS提示在VBScript调用时自动启动。这可能吗?

我知道我可以在提升的命令shell中运行脚本,并且我可以使用

objShell.ShellExecute WScript.FullName,Chr(34)& WScript.ScriptFullName& Chr(34),vbNullString,“runas”

例如,要运行VBScript本身,并且其中任何一个工作正常 - COM方法发现自己​​被提升。

然而,AFAIK在桌面上获得一个提升的资源管理器窗口是错综复杂的(它不像右键单击开始/附件/ Windows资源管理器/以管理员身份运行那么简单,它实际上并没有提升,或者至少是COM方法我希望本地管理员组中的用户能够将文件和文件夹拖放到脚本上,然后让脚本使用这些路径名作为参数调用admin COM接口,并且要提升的COM方法。 (我希望有一些比使用args和使用ShellExecute“runas”更简单的东西。)

我尝试在服务EXE的清单中将UAC执行级别设置为requireAdministrator,并在注册表中为MySvc.Administrator类设置Elevated / Enabled = 1和LocalizedString,这些都不起作用。

编辑:

当我写道COM方法发现自己​​被提升时,我真正的意思是传入的COM请求的安全令牌显示它来自管理员。我正在检查此令牌以查看是否允许该请求。 COM对象所在的Windows服务进程可能作为LocalSystem运行。

2 个答案:

答案 0 :(得分:0)

VBScripts由脚本托管进程托管,因此脚本“继承”Windows脚本宿主的安全上下文。如果托管进程提升,则脚本具有提升的权限。单个接口或单个方法调用无法在托管进程的安全上下文之外升级。

另一件需要注意的事情是,当非升级过程产生升级过程时,UAC始终显示确认信息。因此,当非高架资源管理器对脚本执行“runas”时,用户必须确认。当非提升脚本自身“runas”时,用户也必须确认。

答案 1 :(得分:0)

要回答我自己的问题,是的,是否有可能使UAC对话框从正在访问我服务的自动化界面的vbscript中即时出现。

我所拥有的是Windows服务中的一个类,它暴露了vbscripts访问的管理界面。该接口在允许您执行此操作之前验证您是否具有修改服务的权限。 Vista和Server 2008上发生的情况是,除非您已经处于升级过程中(使用管理安全令牌),否则您使用有限的安全令牌运行,因此服务接口拒绝让您执行任何操作。

为了让UAC对话框出现并提升到服务的路径,我创建了一个新的COM服务器(EXE),它在类中提供完全相同的管理员界面,并通过自动化使自己可用于vbscript 。当你要求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