在 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

Powershell中命令自动补全功能及使用Windows命令

powershell脚本隐藏退出码

在 windows 10 powershell 中使用 sqlplus 执行 sql 文件