【问题标题】:How to change DCOM config identity programmatically如何以编程方式更改 DCOM 配置标识
【发布时间】:2013-12-23 22:20:27
【问题描述】:

有没有办法以编程方式获取有关启动 DCOM 应用程序身份的信息。请参阅附图以了解我的意思。

我尝试使用 WMI

ManagementObjectSearcher s = new ManagementObjectSearcher(new ManagementScope(@"\\.\root\cimv2"), new ObjectQuery(
                "select * from Win32_DCOMApplicationSetting  where AppID='{048EB43E-2059-422F-95E0-557DA96038AF}'"))
ManagementObjectCollection dcomSett = s.Get();
var value = dcomSett.Cast<ManagementObject>().ToArray()
             [0].Properties["RunAsUser"].Value;

但“RunAsUser”属性为空。 还尝试了 Interop.COMAdmin

COMAdmin.COMAdminCatalogClass catalog = (COMAdmin.COMAdminCatalogClass)new COMAdmin.COMAdminCatalog();
(COMAdmin.COMAdminCatalogCollection)catalog.GetCollection("Applications")

通过这种方式,我设法获得了在 MMC 的“组件服务”管理单元中的“COM+ 应用程序”节点下列出的应用程序:

我是 COM、DCOM、COM+ 方面的新手,我肯定错过了一些重要的东西。

过了一会儿,我发现了为什么我曾经在第一种方法(ManagementObject)中得到 NULL。 您将收到:

  • 如果身份当前设置为启动用户,则为NULL
  • “交互式用户”如果是“交互式用户”
  • 在第三个选项的情况下带有用户名的一些字符串(见第一张图片)

但我仍然需要一种方法来更改 MMC 中 DCOM Config 节点下的 Microsoft PowerPoint Slide 等项目的标识。

【问题讨论】:

    标签: c# wmi com+ dcom mmc


    【解决方案1】:

    在 DCOM 配置中,如果您使用特定用户的身份并希望通过代码更新密码,则需要在本地安全机构 (LSA) 中更新密码。这可以通过 Windows API 调用实现。 MS 有一个名为 dcomperm 的实用程序的示例代码,您可以看到它们是如何在 C++ 中实现的。您可以在 C# 中进行相同的调用。请参阅 SetRunAsPassword 方法 here。他们使用方法 LsaOpenPolicy 来获取策略句柄并调用 LsaStorePrivateData 来更新密码。然后他们正在向帐户添加“作为批处理作业登录”访问权限(但如果您只是更改密码,则不需要这样做)。

    This pinvoke.net 上的示例代码看起来像是在进行必要的调用,除了关于授予登录作为批处理作业权限的可选部分。请注意,LSA 中的“密钥”格式为 SCM:{GUID-of-DCOM-object} 示例:SCM:{00000000-0000-0000-0000-000000000000}

    哦,我应该顺便提一下,如果您想更改 RunAs 用户本身(即用户名),您还需要直接在 Windows 注册表中更新它(AFAIK 这是唯一的方法)。 DCOM 条目存储在 HKLM\SOFTWARE\Classes\AppID 下。您可以使用 WMI 或仅使用 .NET 中的 Registry 类来实现。

    【讨论】:

      【解决方案2】:

      这个很简单,可以从

      获取APPId
      Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{048EB43E-2059-422F-95E0-557DA96038AF}
      

      使用

      (RegistryKey dcomPPTIdentity = Registry.LocalMachine.OpenSubKey("Software\\Classes\\AppID\\{048EB43E-2059-422F-95E0-557DA96038AF}"))
      {
          if (dcomPPTIdentity != null)
          {
               Registry.SetValue(dcomPPTIdentity.ToString(), "RunAs", "userName");
          }
      }
      

      【讨论】:

        【解决方案3】:

        我正在成功使用 COMAdmin DLL。试试这样的:

        COMAdminCatalog catalog = new COMAdminCatalog();
        COMAdminCatalogCollection applications = catalog.GetCollection("Applications");
        
        applications.Populate();
        
        for (int i = 0; i < applications.Count; i++)
        {
            COMAdminCatalogObject application = COMAppCollectionInUse.Item[i];
            if (application.Name == "Your COM+ application name")
            {
                    application.Value["Identity"] = "nt authority\\localservice"; // for example
            }
        }
        

        【讨论】:

        • 我试过了,但正如我所说:通过这种方式设法获得了在 MMC 的“组件服务”管理单元中的“COM+ 应用程序”节点下列出的应用程序。但我需要为 "DCOM Comfig" 下的元素获取/设置启动标识,例如 Microsoft PowerPoint Slide
        • 未回答所提问题。 COMAppCollectionInUse 不存在。
        【解决方案4】:

        这适用于我的开发服务器。请记住,它是直接在服务器上针对服务器运行的

        using COMAdmin;
        using System;
        
        namespace ComComponents
        {
            class Program
            {
                static void Main(string[] args)
                {
                    COMAdminCatalog catalog = new COMAdminCatalog();
                    COMAdminCatalogCollection applications = catalog.GetCollection("Applications");
        
                    applications.Populate();
        
                    for (int i = 0; i < applications.Count; i++)
                    {
                        COMAdminCatalogObject application = applications.Item[i];
        
                        Console.WriteLine(application.Name);
                        Console.WriteLine(application.Value["Identity"]);
                    }
        
                    Console.WriteLine("Press any key to continue...");
                    Console.ReadKey();
                }
            }
        }
        

        【讨论】:

        • 这只是 Com+ 而不是“DCom 配置”
        猜你喜欢
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多