通过 PowerShell 的 DCOM 机器级访问和启动权限
Posted
技术标签:
【中文标题】通过 PowerShell 的 DCOM 机器级访问和启动权限【英文标题】:DCOM machine level access and launch permissions via PowerShell 【发布时间】:2017-05-01 12:18:41 【问题描述】:是否可以从 PowerShell 设置机器级别的“我的电脑”访问和启动权限?
相当于
DComPerm.exe -ma set name permit level:l,r
DComPerm.exe -ml set name permit level:l,r
我正在寻找使用 PowerShell v 3.0 的解决方案。目标服务器是 Windows Server 2008 R2 和 2012。
我找到了许多关于设置 DCOM 应用程序安全设置的参考资料。但是我不知道如何在机器或顶层设置它。
https://janbk.wordpress.com/2015/03/12/automating-dcom-acl-with-powershell/
Alternative to using DcomPerm.exe and SetAcl.exe in powershell
【问题讨论】:
正如我在参考答案中所建议的,您是否查看过 Win32_DCOMApplicationSetting 类.. 也请查看此链接:Link 我希望在机器级别设置权限。 Win32_DCOMApplicationSettings 似乎只在应用程序级别。 【参考方案1】:我们一直在使用 WMI 来设置启动权限。 参考:https://rkeithhill.wordpress.com/2013/07/25/using-powershell-to-modify-dcom-launch-activation-settings/
在推出 Windows 安全补丁(补丁号:4012212、4012213 和 4012213)后,此功能停止工作
我们将 WIM powershell 脚本转换为使用 CIM,并负责设置 DCOM 对象的启动权限并与安全补丁一起使用。代码如下供参考:
$ComponentName = "TestComponent" #--- change value as needed
$Username = "Username" #--- change value as needed
$Domain = "Domain" #--- change value as needed
# If you already have a CimSession that you used to get the security descriptor, you can leave this line out and use the existing one:
$CimSession = New-CimSession localhost
Grant-DComAccessToUser -ComponentName $ComponentName -Username $Username -Domain $Domain
# Cleanup
$CimSession | Remove-CimSession
function Grant-DComAccessToUser
param(
[Parameter(Mandatory=$true)][string] $ComponentName,
[Parameter(Mandatory=$true)][string] $Username,
[string] $Domain
)
$DCom = Get-CimInstance -Query "SELECT * from Win32_DCOMApplicationSetting WHERE Description LIKE '$ComponentName%'"
$GetDescriptor = Invoke-CimMethod -InputObject $DCom -MethodName "GetLaunchSecurityDescriptor";
$ExistingDacl = $GetDescriptor.Descriptor.DACL | Where $_.Trustee.Name -eq $Username
if ($ExistingDacl)
$ExistingDacl.AccessMask = 11
else
$NewAce = New-DComAccessControlEntry -Domain $Domain -Username $Username
$GetDescriptor.Descriptor.DACL += $NewAce
Invoke-CimMethod -InputObject $DCom -MethodName "SetLaunchSecurityDescriptor" -Arguments @Descriptor=$GetDescriptor.Descriptor;
function New-DComAccessControlEntry
param(
[Parameter(Mandatory=$true)][string] $Username,
[string] $Domain
)
# Create the Win32_Trustee instance
$Trustee = New-Object ciminstance $CimSession.GetClass("root/cimv2", "Win32_Trustee")
$Trustee.Name = $Username
$Trustee.Domain = $Domain
# Create the Win32_ACE instance
$Ace = New-Object ciminstance $CimSession.GetClass("root/cimv2", "Win32_ACE")
$Ace.AceType = [uint32] [System.Security.AccessControl.AceType]::AccessAllowed
$Ace.AccessMask = 11
$Ace.AceFlags = [uint32] [System.Security.AccessControl.AceFlags]::None
$Ace.Trustee = $Trustee
$Ace
【讨论】:
除非我有什么误解,否则这两个脚本都使用“Win32_DCOMApplicationSetting”类。该类提供应用程序级别的设置/访问。我希望在“我的电脑”或***设置访问权限,如原始屏幕截图所示。谢谢【参考方案2】:您可以更改此脚本:https://gallery.technet.microsoft.com/scriptcenter/Grant-Revoke-Get-DCOM-22da5b96。它使用注册表路径“HKCR:\AppID\$ApplicationID”和注册表项“AccessPermission”、“LaunchPermission”来处理应用程序权限。
您应该使用注册表路径“HKLM:SOFTWARE\Microsoft\Ole”和注册表项“DefaultAccessPermission”、“DefaultLaunchPermission”、“MachineAccessRestriction”、“MachineLaunchRestriction”。
“配置远程 DCOM”章节中的更多信息:https://books.google.ru/books?id=rbpNppFdipkC&pg=PT211&lpg=PT211&dq=dcom+grant+local+launch+permission+powershell&source=bl&ots=5ZfeVca5NA&sig=9lMN_VeymG8cf73KT062QTsWWkc&hl=ru&sa=X&ved=0ahUKEwikn73f6YLcAhVEDSwKHUftCwkQ6AEIfDAI#v=onepage&q&f=true
【讨论】:
以上是关于通过 PowerShell 的 DCOM 机器级访问和启动权限的主要内容,如果未能解决你的问题,请参考以下文章