0

我正在尝试使用作为 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 服务器。

4

0 回答 0