在.NET上运行不同帐户的COM组件

时间:2011-09-06 10:34:46

标签: c# .net com impersonation

我有一个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();

2 个答案:

答案 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控制面板/管理工具/组件服务)是您的朋友。创建一个新包,将组件添加到其中,为该包配置所需的任何用户。消费者甚至不会注意到差异。

当然,组件将在进程外运行,因此理论上它的某些方面可能会中断(例如,将特定于进程的句柄作为参数传递)。但在互操作场景中,这种情况相当罕见。

此外,您可以调用除调用者服务之外的组件。