C# 在不同帐户上运行.NET中的COM组件
我有一个COM组件,我从作为本地系统运行的.NET Windows服务调用它。此服务调用COM组件,然后该组件在系统帐户下运行。在调试时,我尝试在不同的用户帐户下测试COM组件的运行。我正在使用模拟来实现这一点,并且我已经在其他方面成功地使用了相同的代码。但是,尝试以相同的方式在不同的帐户下加载COM组件是行不通的。它仍作为系统帐户加载 使用COM互操作加载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
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标识运行。这就是我试图通过使用模拟来实现的,但它仍然在系统下运行。它适用于应用程序,因为启动应用程序的标识不是系统。对于服务,启动它的标识是系统。