COM shell扩展以覆盖“以管理员身份运行”在开始菜单搜索中失败

3
我在开发一个COM服务器DLL,目的是覆盖Windows 10中的“以管理员身份运行”功能。我通过将DLL GUID设置为Computer\HKEY_CLASSES_ROOT\exefile\shell\runas\command注册表键上的DelegateExecute来实现。我已经创建了32位和64位版本的CLSID条目(作为InprocServer32)。 这个方法大部分情况下都有效。在资源管理器中右键点击exe文件并以管理员身份运行会委托给DLL,如果安装程序试图以提升的权限启动,则会委托给DLL,右键单击开始菜单项目也可以委托。但唯一的问题是,在使用开始菜单搜索并单击“运行命令”列出的项目时(例如搜索“wusa”),然后单击搜索结果右侧的“以管理员身份运行”(或通过右键单击结果),就不起作用了。 通过使用sysinternals的Process Monitor,我可以看到RuntimeBroker.exe正确读取注册表并检测到需要调用我的DLL,但在获取文件名后停止,并查看名为...\AppActivationErrorHandlers\80270301的注册表键,然后停止。0x80270301是称为E_SHELL_EXTENSION_BLOCKED的符号的值,因此我认为它与此有关。但我找不到任何关于它被阻止的原因的信息。 有人能指引我正确方向吗?

你是否在Shell扩展的批准密钥中注册了自己?尽管这个策略执行通常不会激活(但自NT4以来一直存在)。也可能是因为它没有签名(或未被微软签名)。进程可以选择加入此签名要求。 - Anders
谢谢您的建议,但似乎没有任何区别。 - Lasse Hassing
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
0

我通过从InprocServer(DLL)切换到LocalServer(EXE)来解决了这个问题。可能是因为一个独立的exe的安全要求比DLL更低。


尝试使用LocalServer进行相同操作时,遇到了两个问题:右键以管理员身份运行会被委派,但双击带有盾牌图标的exe文件不会被委派。第二个问题是委派不会接收consent.exe的参数,而是作为一个参数接收“-Embedding”。你是否也遇到了这些问题? - Darksody
尝试使用LocalServer进行相同操作时,遇到了两个问题:右键以管理员身份运行会被委派,但是双击带有盾牌图标的exe文件不会被委派。第二个问题是委派不会接收到consent.exe的参数,而是作为一个参数接收到了"-Embedding"。你是否也遇到了这些问题? - undefined
-Embedding参数是启动COM服务器的方式。相反,您需要实现对IExecuteCommand、IInitializeCommand和IObjectWithSelection的支持,以捕获各种数据和事件。 不幸的是,consent.exe可以获取到一些数据,但COM服务器却不能(请求提权的父进程ID)。 覆盖run-as委托还会破坏许多使用ShellExecuteEx的软件和安装程序,因为当调用通过COM服务器进行时,SHELLEXECUTEINFO.hProcess句柄总是设置为null。 - Lasse Hassing
-Embedding参数是启动COM服务器的方式。您需要实现对IExecuteCommand、IInitializeCommand和IObjectWithSelection的支持,以捕获各种数据和事件。 不幸的是,consent.exe可以获取到一些数据,但COM服务器却不能获取到(请求提升的父级ID)。 覆盖run-as委托还会破坏许多使用ShellExecuteEx的软件和安装程序,因为当调用通过COM服务器进行时,SHELLEXECUTEINFO.hProcess句柄总是设置为null。 - undefined
找到了,非常感谢。对于其他需要这些信息的人,微软已经将其放在 GitHub 上:https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/ExecuteCommandVerb - Darksody
找到了,非常感谢。对于其他需要这些信息的人来说,微软在GitHub上有相关内容:https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/ExecuteCommandVerb - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,