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

C# 在不同帐户上运行.NET中的COM组件,c#,.net,com,impersonation,C#,.net,Com,Impersonation,我有一个COM组件,我从作为本地系统运行的.NET Windows服务调用它。此服务调用COM组件,然后该组件在系统帐户下运行。在调试时,我尝试在不同的用户帐户下测试COM组件的运行。我正在使用模拟来实现这一点,并且我已经在其他方面成功地使用了相同的代码。但是,尝试以相同的方式在不同的帐户下加载COM组件是行不通的。它仍作为系统帐户加载 使用COM互操作加载COM组件时,是否有不同的过程来执行此操作 代码只是: var identity = Impersonate.GetIdentity(Use

我有一个COM组件,我从作为本地系统运行的.NET Windows服务调用它。此服务调用COM组件,然后该组件在系统帐户下运行。在调试时,我尝试在不同的用户帐户下测试COM组件的运行。我正在使用模拟来实现这一点,并且我已经在其他方面成功地使用了相同的代码。但是,尝试以相同的方式在不同的帐户下加载COM组件是行不通的。它仍作为系统帐户加载

使用COM互操作加载COM组件时,是否有不同的过程来执行此操作

代码只是:

var identity = Impersonate.GetIdentity(Username, Domain, Password);
identity.Impersonate();
MyLib.Component com = new MyLib.Component();

我会尝试使用文档中演示的无管理的
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
方法提供密码。

COM+(也称为控制面板/管理工具/组件服务)是您的朋友。创建一个新包,将组件添加到其中,为该包配置任何用户。消费者甚至不会注意到这种差异

组件肯定会耗尽进程,因此它的某些方面可能会在理论上出现问题(比如,将特定于进程的句柄作为参数传递)。但在互操作场景中,这种情况相当罕见


此外,您还可以在调用方服务之外调试组件。

如果您从普通应用程序创建COM组件,它是否使用您的windows标识运行?某些COM组件可以配置为仅在特定帐户下运行。如果从普通应用程序运行,则可以使用我的windows标识运行。这就是我试图通过使用模拟来实现的,但它仍然在系统下运行。它适用于应用程序,因为启动应用程序的标识不是系统。对于服务,启动它的标识是系统。