Как программно изменить идентификатор конфигурации DCOM

Есть ли способ получить информацию о запуске идентификатора приложения DCOM программно. Смотрите прикрепленную картинку, чтобы понять, что я имею в виду.

Снимок экрана со свойствами приложения из конфигурации 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")

таким образом мне удалось получить приложения, которые перечислены в узле «Приложения COM+» в оснастке «Службы компонентов» MMC:

Приложения COM+

Я новичок в COM, DCOM, COM+ и уверен, что пропустил что-то важное.

Через некоторое время я понял, почему я использовал NULL в первом подходе (ManagementObject). Вы получите:

  • NULL, если идентификатор в настоящее время установлен как Запускающий пользователь
  • "Интерактивный пользователь" в случае "Интерактивный пользователь"
  • некоторая строка с именем пользователя в случае третьего варианта (см. первое изображение)

Но все же мне нужен способ изменить удостоверение для таких элементов, как Microsoft PowerPoint Slide в узле DCOM Config в MMC.


person Oleksii    schedule 06.12.2013    source источник


Ответы (4)


В конфигурации DCOM, если вы используете определенного пользователя для идентификации и хотите обновить пароль с помощью кода, вам необходимо обновить его в локальном органе безопасности (LSA). Это возможно с помощью вызовов Windows API. У MS есть пример кода для утилиты под названием dcomperm, которая делает это, и вы можете увидеть, как они реализованы на C++. Вы можете делать те же вызовы на C#. См. метод SetRunAsPassword: ">здесь. Они используют метод LsaOpenPolicy для получения дескриптора политики и вызывают LsaStorePrivateData для обновления пароля. Затем они добавляют к учетной записи доступ «вход в качестве пакетного задания» (но это не обязательно, если вы только меняете пароль).

Этот пример кода на pinvoke.net выглядит так, как будто он выполняет необходимые вызовы, за исключением необязательной части о предоставлении входа в качестве разрешения на пакетное задание. Обратите внимание, что «ключ» в LSA имеет формат SCM:{GUID-of-DCOM-object} Пример: SCM:{00000000-0000-0000-0000-000000000000}

О, и я должен упомянуть в стороне, что если вы хотите изменить самого пользователя RunAs (то есть имя пользователя), вам также нужно будет обновить его напрямую в реестре Windows (насколько я знаю, это единственный способ сделать это). Записи DCOM хранятся в HKLM\SOFTWARE\Classes\AppID. Вы можете сделать это с помощью WMI или просто использовать классы реестра в .NET.

person Brad Albright    schedule 09.06.2017

Это очень просто, вы можете получить 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");
    }
}
person M. Jamil Raza    schedule 28.04.2020

Я успешно использую 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
    }
}
person Manuel Quijada    schedule 08.12.2013
comment
Я попробовал это, но, как я уже сказал: таким образом удалось получить приложения, которые перечислены в узле COM + Applications в оснастке Component Services MMC. Но мне нужно получить/установить идентификатор запуска для элементов в DCOM Comfig, например Microsoft PowerPoint Slide - person Oleksii; 09.12.2013
comment
Не отвечая на заданный вопрос. COMAppCollectionInUse не существует. - person Isham Mohamed; 17.10.2016

Это работает для меня на моем сервере разработки. Имейте в виду, он запускается против сервера непосредственно на сервере

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();
        }
    }
}
person Ron Hagerman    schedule 21.12.2016
comment
Это только Com+, а не DCom Config - person uli78; 19.04.2018