我正在尝试使用作为 NetworkService 运行的 Windows 服务中的IRASrv COM 接口。当我从以登录用户身份运行的控制台应用程序实例化IRASrv
界面时,一切正常:
IRASrv srv = null;
try
{
srv = (IRASrv)Activator.CreateInstance(Type.GetTypeFromCLSID(raSrvCLSID, true));
if (srv != null)
{
Array sessionUsers = null;
int sessionCount = 0;
srv.GetSessionInfo(ref sessionUsers, ref sessionCount);
if (sessionCount > 0)
{
string result = string.Empty;
srv.GetNoviceUserInfo(ref result);
Console.Out.WriteLine(result);
}
}
}
catch (COMException e)
{
Console.WriteLine(e.Message);
}
finally
{
if (srv != null)
{
Marshal.ReleaseComObject(srv);
}
}
当我从我的 NetworkService 服务尝试相同的代码时,IRASrv
对象实例化失败并出现访问被拒绝错误:
由于以下错误,检索具有 CLSID {3C3A70A7-A468-49B9-8ADA-28E11FCCA5D} 的组件的 COM 类工厂失败:80070005 访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))。
接下来,我尝试通过连续调用来模拟登录用户:
- 登录用户(...,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,...)
- WindowsImpersonationContext.Impersonate()
模拟成功,但当我随后尝试实例化 COM 服务器对象时,我仍然收到拒绝访问错误。
我对 C# 中的 COM 互操作的理解有些不稳定。这里可能出了什么问题?
更新
我在事件日志中看到此错误:
特定于应用程序的权限设置不会将具有 CLSID {3C3A70A7-A468-49B9-8ADA-28E11FCCA5D} 和 APPID {F8FD03A6-DDD9-4C1B-84EE-58159476A0D7} 的 COM 服务器应用程序的本地激活权限授予用户 NT AUTHORITY\NETWORK SERVICE SID (S-1-5-20) 来自地址 LocalHost (Using LRPC) 在应用程序容器中运行的 Unavailable SID (不可用)。可以使用组件服务管理工具修改此安全权限。
因此,显然冒充已登录的交互式用户不足以激活 COM 服务器。