在 powershell 中使用 DcomPerm.exe 和 SetAcl.exe 的替代方法
Posted
技术标签:
【中文标题】在 powershell 中使用 DcomPerm.exe 和 SetAcl.exe 的替代方法【英文标题】:Alternative to using DcomPerm.exe and SetAcl.exe in powershell 【发布时间】:2017-01-30 10:55:45 【问题描述】:我正在编写一个脚本并试图减少它对外部文件的依赖数量。目前,我正在通过以下方式调用 DComPerm.exe 和 SetAcl.exe:
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 代码来减少对文件的依赖?
【问题讨论】:
【参考方案1】:你可以这样使用:
$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 合并相同的内容。传递参数时需要一些转义序列。
你可以创建一个Win32_DCOMApplicationSetting的实例:
$dcomperm=Get-WMIObject -Class Win32_DCOMApplicationSetting
DCOM 应用程序实例有几个安全描述符。从 Windows Vista 开始,使用 Win32_DCOMApplicationSetting 类的方法来获取或更改各种安全描述符。安全描述符作为 Win32_SecurityDescriptor 类的实例返回。
这是我从这里获得的用于 DCOM 设置的代码:
参考链接: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-ACl 将帮助您完成 SetACL.exe 工作
希望对你有帮助。
【讨论】:
您好,感谢您的回复,但我试图避免使用DcomPerm.exe
。你知道这是怎么可能的吗?
@methuselah: 你可以创建一个 Win32_DCOMApplicationSetting 的实例
不,您必须设置不同的参数,如示例中所示。也按照链接。对于 ACL,您可以直接使用 Set-Acl
来完成您的工作。
答案中提到了链接作为参考链接 DCOM 设置。
在这种情况下我必须检查成员。请也检查一下Link以上是关于在 powershell 中使用 DcomPerm.exe 和 SetAcl.exe 的替代方法的主要内容,如果未能解决你的问题,请参考以下文章
powershell 使用SendGrid从PowerShell发送电子邮件(在Azure中)
通过 powershell 在 jenkins 中使用 AnsiColor
在 PowerShell 中使用特定配置文件启动 Chrome