首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程方式更改DCOM配置标识

如何以编程方式更改DCOM配置标识
EN

Stack Overflow用户
提问于 2013-12-06 14:16:06
回答 4查看 5.7K关注 0票数 7

是否有任何方式以编程方式获取有关启动DCOM应用程序标识的信息。请看附图来理解我的意思。

我试着用WMI

代码语言:javascript
复制
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

代码语言:javascript
复制
COMAdmin.COMAdminCatalogClass catalog = (COMAdmin.COMAdminCatalogClass)new COMAdmin.COMAdminCatalog();
(COMAdmin.COMAdminCatalogCollection)catalog.GetCollection("Applications")

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

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

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

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

但是,我仍然需要一种方法来更改MMC中的、微软、PowerPoint、幻灯片、、DCOM、Config节点等项目的标识。

EN

回答 4

Stack Overflow用户

发布于 2017-06-09 14:41:21

在DCOM配置中,如果您使用特定用户作为标识,并且希望通过代码更新密码,则需要在(LSA)中更新密码。这在Windows调用中是可能的。MS有一个名为dcomperm的实用程序的示例代码,您可以看到它们是如何在C++中实现的。您可以在C#中打同样的电话。请参见SetRunAsPassword方法这里。他们使用LsaOpenPolicy方法获取策略的句柄,并调用LsaStorePrivateData更新密码。然后,他们添加了“作为批处理作业登录”对帐户的访问权限(但如果您只更改密码,则不需要这样做)。

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

哦,顺便提一下,如果您想更改RunAs用户本身(即用户名),您还需要在windows注册表中直接更新它(AFAIK,这是唯一的方法)。DCOM条目存储在HKLM\SOFTWARE\Classes\AppID下。您可以使用WMI完成这一任务,也可以只使用.NET中的Registry。

票数 2
EN

Stack Overflow用户

发布于 2020-04-28 11:18:25

这很简单,您可以从

代码语言:javascript
复制
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{048EB43E-2059-422F-95E0-557DA96038AF}

使用

代码语言:javascript
复制
(RegistryKey dcomPPTIdentity = Registry.LocalMachine.OpenSubKey("Software\\Classes\\AppID\\{048EB43E-2059-422F-95E0-557DA96038AF}"))
{
    if (dcomPPTIdentity != null)
    {
         Registry.SetValue(dcomPPTIdentity.ToString(), "RunAs", "userName");
    }
}
票数 0
EN

Stack Overflow用户

发布于 2013-12-08 11:26:03

我正在成功地使用COMAdmin动态链接库。试着做这样的事情:

代码语言:javascript
复制
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
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20426043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档