Visual c++ 如何为以不同用户身份运行的代理服务器初始化COM模拟?

Visual c++ 如何为以不同用户身份运行的代理服务器初始化COM模拟?,visual-c++,com,win32com,com-server,Visual C++,Com,Win32com,Com Server,我有一个应用程序以非登录用户的身份运行。我在dllhost.exe中有一个COM服务器,它在登录用户的凭据下运行。 如何在客户端上设置COM安全性,以便能够与服务器通信?当我尝试创建和创建对象的实例时,我得到一个E_ACCESSDENIED(0x80070005)。 详情如下: 我有一个COM组件,它在标准代理项(dllhost.exe)下运行,AppID{GUID}\RunAs设置为“interactive user” 客户端以不同的用户身份运行,并调用CCO。此时,我可以确认DCOM服务启动

我有一个应用程序以非登录用户的身份运行。我在dllhost.exe中有一个COM服务器,它在登录用户的凭据下运行。 如何在客户端上设置COM安全性,以便能够与服务器通信?当我尝试创建和创建对象的实例时,我得到一个E_ACCESSDENIED(0x80070005)。 详情如下: 我有一个COM组件,它在标准代理项(dllhost.exe)下运行,AppID{GUID}\RunAs设置为“interactive user”

客户端以不同的用户身份运行,并调用CCO。此时,我可以确认DCOM服务启动dllhost.exe并创建服务器。但是,由于客户端和服务器的凭据不同,CCO返回0x80070005。 我还尝试将调用CCO的线程(令牌)设置为与COM服务器(dllhost)相同的凭据,但仍然失败

我知道我可以使用COM伪装来协商安全性,但是,它不是很清楚。我想确保它只调用模拟的这个组件,而不是进程中的所有COM调用。
任何帮助都将不胜感激。

您是否可以控制COM对象注册?如果是这样,您可能希望在AppId注册(请参阅)中设置AccessPermission DACL,以确保激活后可以访问COM对象。我试图通过将CLSCTX_LOCAL_SERVER | CLSCTX_ENABLE_隐身传递给CoCreateInstance(线程模拟为登录用户)来创建coClass的实例。这起作用了,我得到了一个coClass的实例。但是,任何调用(包括QI)都会导致E_ACCESSDENIED,即使是在同一个线程上(仍然是模拟的)。@tyranid,理想情况下,除了最低的强制设置之外,我不希望避免任何注册表调整。如果可用,我更喜欢编程解决方案。我原以为CCO中的CLSCTX_ENABLE_隐身可以完成这项工作,但它似乎只足以创建对象的实例,除非我遗漏了什么。不过,谢谢你的提示,这将是我的退路。你在CoInitializeSecurity标志中设置了EOAC_DYNAMIC_隐形吗?或者使用IClientSecurity在代理本身上设置掩蔽?否则实际调用将不会被使用,CLSCTX_ENABLE_掩蔽的文档似乎表明它仅用于激活请求,并不表明它也将掩蔽绑定到代理。@tyranid。谢谢你的建议。我已经使用了IClientSecurity(CoSetProxyBlanket)并降低了身份验证级别。从某种意义上说,它确实有效,因为我现在能够调用代理的coClass。然而,当涉及到显示来自coClass的UI时,它失败了。我现在正在研究解决UI问题。简单地说,CoSetProxyBlanket在一定程度上可以工作(在CCO中没有CLSCTX_ENABLE_掩蔽),但仍有一些问题需要解决。您可以控制COM对象注册吗?如果是这样,您可能希望在AppId注册(请参阅)中设置AccessPermission DACL,以确保激活后可以访问COM对象。我试图通过将CLSCTX_LOCAL_SERVER | CLSCTX_ENABLE_隐身传递给CoCreateInstance(线程模拟为登录用户)来创建coClass的实例。这起作用了,我得到了一个coClass的实例。但是,任何调用(包括QI)都会导致E_ACCESSDENIED,即使是在同一个线程上(仍然是模拟的)。@tyranid,理想情况下,除了最低的强制设置之外,我不希望避免任何注册表调整。如果可用,我更喜欢编程解决方案。我原以为CCO中的CLSCTX_ENABLE_隐身可以完成这项工作,但它似乎只足以创建对象的实例,除非我遗漏了什么。不过,谢谢你的提示,这将是我的退路。你在CoInitializeSecurity标志中设置了EOAC_DYNAMIC_隐形吗?或者使用IClientSecurity在代理本身上设置掩蔽?否则实际调用将不会被使用,CLSCTX_ENABLE_掩蔽的文档似乎表明它仅用于激活请求,并不表明它也将掩蔽绑定到代理。@tyranid。谢谢你的建议。我已经使用了IClientSecurity(CoSetProxyBlanket)并降低了身份验证级别。从某种意义上说,它确实有效,因为我现在能够调用代理的coClass。然而,当涉及到显示来自coClass的UI时,它失败了。我现在正在研究解决UI问题。简单地说,CoSetProxyBlanket在一定程度上可以工作(在CCO中没有CLSCTX_ENABLE_掩蔽),但仍有一些问题需要解决。