Измените параметры безопасности конфигурации DCOM с помощью Powershell

Мне было поручено написать сценарии Powershell для настройки сервера с нуля для запуска одной из наших служб как части веб-приложения, и одним из шагов, необходимых для настройки этого сервера, является изменение конфигурации DCOM для установленной службы. , в частности добавление учетных записей в разрешения «Запуск и активация» / «Доступ», а также установка разрешений для этих учетных записей после их добавления.

Есть ли вообще способ сделать это с помощью Powershell? Мне не удалось найти конкретный метод выполнения того, чего я хочу достичь, поэтому любая помощь будет отличной.


person Vermin    schedule 06.07.2012    source источник


Ответы (2)


Похоже, вы бы сделали это с помощью WMI.

Получите экземпляр: Win32_DCOMApplicationSetting следующим образом:

$dcom = Get-WMIObject -Class Win32_DCOMApplicationSetting -Filter 'Description="Something"'

Теперь у вас есть доступ к методам SetAccessSecurityDescriptor и SetLaunchSecurityDescriptor.

Откуда: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384905(v=vs.85).aspx

DCOM-приложения

Экземпляры приложения DCOM имеют несколько дескрипторов безопасности. Начиная с Windows Vista, используйте методы класса Win32_DCOMApplicationSetting для получения или изменения различных дескрипторов безопасности. Дескрипторы безопасности возвращаются как экземпляры класса Win32_SecurityDescriptor.

Чтобы получить или изменить разрешения на настройку, вызовите методы GetConfigurationSecurityDescriptor или SetConfigurationSecurityDescriptor.

Чтобы получить или изменить права доступа, вызовите методы GetAccessSecurityDescriptor или SetAccessSecurityDescriptor.

Чтобы получить или изменить разрешения на запуск и активацию, вызовите методы GetLaunchSecurityDescriptor или SetLaunchSecurityDescriptor.

Windows Server 2003, Windows XP, Windows 2000, Windows NT 4.0 и Windows Me/98/95: методы дескриптора безопасности Win32_DCOMApplicationSetting недоступны.

Существует также инструмент под названием DCOMPERM, исходный код которого доступен в Windows SDK: http://www.microsoft.com/en-us/download/details.aspx?id=8279

Вы можете найти скомпилированные версии в Интернете, если вы ищете скомпилированный DCOMPERM.

Вот параметры командной строки:

Syntax: dcomperm <option> [...] 
Options:

Modify or list the machine access permission list 
-ma <"set" or "remove"> <Principal Name> ["permit" or "deny"] ["level:l,r"] 
-ma list

Modify or list the machine launch permission list 
-ml <"set" or "remove"> <Principal Name> ["permit" or "deny"] ["level:l,r,ll,la,rl,ra"] 
-ml list

Modify or list the default access permission list 
-da <"set" or "remove"> <Principal Name> ["permit" or "deny"] ["level:l,r"] 
-da list

Modify or list the default launch permission list 
-dl <"set" or "remove"> <Principal Name> ["permit" or "deny"] ["level:l,r,ll,la,rl,ra"] 
-dl list

Modify or list the access permission list for a specific AppID 
-aa <AppID> <"set" or "remove"> <Principal Name> ["permit" or "deny"] ["level:l,r"] 
-aa <AppID> default 
-aa <AppID> list

Modify or list the launch permission list for a specific AppID 
-al <AppID> <"set" or "remove"> <Principal Name> ["permit" or "deny"] ["level:l,r,ll,la,rl,ra"] 
-al <AppID> default 
-al <AppID> list

level: 
    ll - local launch (only applies to {ml, dl, al} options) 
    rl - remote launch (only applies to {ml, dl, al} options) 
    la - local activate (only applies to {ml, dl, al} options) 
    ra - remote activate (only applies to {ml, dl, al} options) 
    l - local (local access - means launch and activate when used with {ml, dl, al} options) 
    r - remote (remote access - means launch and activate when used with {ml, dl, al} options)
person Andy Arismendi    schedule 10.07.2012
comment
Спасибо, Энди, это очень помогло! В конце концов я использовал смесь обоих методов. Я использовал Win32_DCOMApplicationSetting, чтобы получить идентификаторы приложений, а затем использовал DComPerm, чтобы добавить необходимые разрешения. Что-то, что я нашел немного странным, заключалось в том, что CMD запускал DcomPerm с гораздо меньшими проблемами, чем Powershell, поэтому, чтобы добиться того, что мне нужно, я написал пакетный файл, в который были переданы определенные переменные, и вызвал его из Powershell. - person Vermin; 11.07.2012
comment
@Vermin Я предполагаю, что проблемы, которые у вас были с PowerShell, вероятно, связаны с синтаксисом / синтаксическим анализом командной строки. Может быть, напишите ошибку, которую вы получили? - person Andy Arismendi; 11.07.2012

У меня был тот же вопрос, что и у ОП. Ответ, опубликованный Энди, был очень полезным и помог мне на полпути. Затем я нашел Set-DCOMLaunchPermissions, написанный кем-то, чтобы помочь им развернуть SharePoint. .

Я адаптировал их функцию для своих целей и придумал решение, которое устанавливает нужные мне разрешения.

$user = "sql2012agent"
$domain = "MYDOMAIN"
$appdesc = "Microsoft SQL Server Integration Services 11.0"
$app = get-wmiobject -query ('SELECT * FROM Win32_DCOMApplicationSetting WHERE Description = "' + $appdesc + '"') -enableallprivileges
#$appid = "{83B33982-693D-4824-B42E-7196AE61BB05}"
#$app = get-wmiobject -query ('SELECT * FROM Win32_DCOMApplicationSetting WHERE AppId = "' + $appid + '"') -enableallprivileges
$sdRes = $app.GetLaunchSecurityDescriptor()
$sd = $sdRes.Descriptor
$trustee = ([wmiclass] 'Win32_Trustee').CreateInstance()
$trustee.Domain = $domain
$trustee.Name = $user
$fullControl = 31
$localLaunchActivate = 11
$ace = ([wmiclass] 'Win32_ACE').CreateInstance()
$ace.AccessMask = $localLaunchActivate
$ace.AceFlags = 0
$ace.AceType = 0
$ace.Trustee = $trustee
[System.Management.ManagementBaseObject[]] $newDACL = $sd.DACL + @($ace)
$sd.DACL = $newDACL
$app.SetLaunchSecurityDescriptor($sd)
person Elijah W. Gagne    schedule 28.02.2014
comment
Я пытаюсь использовать сценарий PS, опубликованный @Elijah W. Gagne выше, для настройки DCOM, и получаю сообщение об ошибке. Свойство «DACL» не может быть найдено для этого объекта. Убедитесь, что свойство существует и может быть установлено. Ошибка для строки $sd.DACL = $newDACL. Я не очень хорошо разбираюсь в использовании PS. Может ли кто-нибудь сказать мне, что мне нужно сделать, чтобы сделать эту работу. Спасибо большое! - person RGuggisberg; 04.09.2015
comment
Я бы запускал все до строки 4. Затем выводил переменную $app и подтверждал, что она не пуста (null). Если это так, вам, вероятно, придется изменить предложение WHERE в строке 4. - person Elijah W. Gagne; 08.09.2015
comment
Да, мне пришлось изменить свою, так как я использовал версию 12.0, а не 11.0, и я обнаружил, что $app имеет значение null. Но после изменения $appdesc, чтобы он подходил мне, сценарий сработал. - person Alan Mullett; 15.11.2016
comment
Я могу сделать это, только если у меня уже загружена оснастка Component Services — DCOM Config. Есть ли способ сделать это программно? - person RGuggisberg; 08.02.2019
comment
Не забудьте использовать переключатель -EnableAllPrivileges с вызовом Get-WMIObject, иначе дескриптор безопасности будет нулевым (возможно, поэтому вы получите сообщение об ошибке, что DACL не может быть найден). - person Markus Szumovski; 06.09.2019