2017-01-30 3 views
0

Я пишу сценарий и пытаюсь уменьшить количество зависимостей, которые он имеет во внешних файлах. На данный момент, я звонить в DComPerm.exe и SetAcl.exe следующим образом:Альтернатива использованию DcomPerm.exe и SetAcl.exe в powershell

DComPerm.exe

$newGroup = "JFSLJSDFJ\Mst-SvcAccounts" 
$daListResult = .\DComPerm.exe -da list 
$dlListResult = .\DComPerm.exe -dl list 
.\DComPerm.exe -da set $newGroup permit level:r,l 

SetACL.exe

$registryPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\34242342435435" 
.\SetACL.exe -on $registryPath -ot reg -actn setowner -ownr "n:$machineHost\Administrators" 
.\SetACL.exe -on $registryPath -ot reg -actn ace -ace "n:$machineHost\Administrators;p:full" 

ли вместо этого можно заменить эти вызовы кодом Powershell, чтобы уменьшить зависимости от файла?

ответ

2

Вы можете использовать что-то вроде этого:

$newGroup = "JFSLJSDFJ\Mst-SvcAccounts" 
$daListResult = .\DComPerm.exe -da list 
$dlListResult = .\DComPerm.exe -dl list 

& ".\DComPerm.exe -da set $newGroup permit level:r,l" 

ИЛИ

Invoke-Expression "& `".\DComPerm.exe -da set $newGroup permit level:r,l`"" 

ИЛИ

[System.Diagnostics.Process]::Start(".\DComPerm.exe -da set $newGroup permit level:r,l") 

Вы можете включить то же самое для ACL также. При передаче параметров вам потребуется некоторая escape-последовательность.

Вы можете создать экземпляр Win32_DCOMApplicationSetting:

$dcomperm=Get-WMIObject -Class Win32_DCOMApplicationSetting 

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

вот код, который я получил здесь для настройки DCOM:

Reference Ссылка: DCOM Settings

$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) 

Set-АХ поможет вам сделать SetACL.exe РАБОТУ

Надеюсь, что это поможет.

+0

Привет, спасибо за ответ, но я стараюсь уйти от использования 'DcomPerm.exe'. Вы знаете, как это возможно? – methuselah

+0

@methuselah: Вы можете создать экземпляр Win32_DCOMApplicationSetting –

+0

Можете ли вы показать мне, как это будет выглядеть в моем коде? – methuselah

Смежные вопросы