有没有办法以编程方式获取有关启动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。 您将收到:
但我还是需要一种方法来更改MMC中 DCOM配置节点下的 Microsoft PowerPoint幻灯片等项目的身份。
答案 0 :(得分:2)
在DCOM配置中,如果您使用特定用户身份并且想要通过代码更新密码,则需要在本地安全机构(LSA)中更新密码。这可以通过Windows API调用实现。 MS有一个名为dcomperm的实用程序的示例代码可以执行它,您可以看到它们是如何在C ++中实现的。您可以在C#中进行相同的调用。请参阅SetRunAsPassword方法here。他们使用LsaOpenPolicy方法获取策略句柄并调用LsaStorePrivateData来更新密码。然后他们正在添加&#34;登录作为批处理作业&#34;访问该帐户(但如果您只是更改密码则不应该这样做。)
pinvoke.net上的This示例代码看起来正在进行必要的调用,但有关将登录作为批处理作业权限授予的可选部分除外。注意&#34;键&#34;在LSA中的格式为SCM:{GUID-of-DCOM-object}示例:SCM:{00000000-0000-0000-0000-000000000000}
哦,我应该提一下如果你想改变RunAs用户本身(即用户名),你还需要直接在Windows注册表中更新它(AFAIK那是&#39; s唯一的方法)。 DCOM条目存储在HKLM \ SOFTWARE \ Classes \ AppID下。您可以使用WMI执行此操作,或者只使用.NET中的注册表类。
答案 1 :(得分:0)
这很简单,您可以从
获取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");
}
}
答案 2 :(得分:-1)
我正在成功使用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
}
}
答案 3 :(得分:-2)
这适用于我的开发服务器。请记住,它直接在服务器上对服务器运行
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();
}
}
}