2013-12-06 8 views
3

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

Screenshot with application properties from DCOM Config

Я попытался использовать 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 + Applications» в разделе «Службы компонентов» оснастки ММС:

COM+ applications

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

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

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

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

ответ

-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 
    } 
} 
+0

Я попробовал, но, как я сказал: таким образом удалось получить приложения, которые перечислены в узле «COM + Applications» в оснастке «Службы компонентов» MMC. Но мне нужно получить/установить идентификатор запуска для элементов под ** «DCOM Comfig» **, например ** Microsoft PowerPoint Slide ** – Alex

+0

Не отвечая на заданный вопрос. 'COMAppCollectionInUse' не существует. –

-1

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

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(); 
     } 
    } 
} 
0

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

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.