我有一个COM组件,我从.NET Windows服务调用它作为本地系统运行。此服务调用COM组件,然后在SYSTEM帐户下运行。在我调试时,我正在尝试测试在不同用户帐户下运行COM组件。我正在使用Impersonation执行此操作,并且我已使用相同的代码成功执行其他操作。但是,尝试在不同的帐户下加载COM组件同样的事情是行不通的。它仍然以SYSTEM帐户加载。
使用COM Interop加载COM组件时是否有不同的过程?
代码只是:
var identity = Impersonate.GetIdentity(Username, Domain, Password);
identity.Impersonate();
MyLib.Component com = new MyLib.Component();
答案 0 :(得分:1)
我会尝试使用WindowsIdentity.Impersonate Method文档中演示的无法LogonUser
方法。
基本上以用户身份登录,然后使用该令牌来模拟该用户:
bool returnValue = LogonUser(userName, domainName, password,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
out safeTokenHandle);
using (WindowsImpersonationContext impersonatedUser =
WindowsIdentity.Impersonate(userToken)
{
Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);
MyLib.Component com = new MyLib.Component();
}
以上是基于MSDN代码的简化非编译片段,以显示整体方法。
不好的部分是密码必须提供给LogonUser
方法。
答案 1 :(得分:0)
COM +(AKA控制面板/管理工具/组件服务)是您的朋友。创建一个新包,将组件添加到其中,为该包配置所需的任何用户。消费者甚至不会注意到差异。
当然,组件将在进程外运行,因此理论上它的某些方面可能会中断(例如,将特定于进程的句柄作为参数传递)。但在互操作场景中,这种情况相当罕见。
此外,您可以调用除调用者服务之外的组件。