我试图允许通过winrs远程访问服务器。在互联网上的某个地方,我发现这需要修改winSDm服务的RootSDDL,并且可以像这样获取它的值:
(Get-Item WSMAN:\localhost\Service\RootSDDL).Value
O:NSG:BAD:P(A;;GA;;;BA)(A;;GA;;;S-1-5-21-3231263931-1371906242-1889625497-1141)S:P(AU;FA;GA;;;WD)(AU;SA;GWGX;;;WD)
现在,问题如下:当我知道要允许远程访问的用户的SID时,如何添加到(A;;GA;;;S-1-5-21-The-rest-of-my-user-SID)
这个SDDL ACE?
是否有任何代码片段将SDDL解析为ACE数组,修改它并解析回来?
答案 0 :(得分:1)
此代码不能完全正常工作,但如果您修复了$ArgumentList
对象的构造函数参数(在ObjectAce
变量中),那么您应该能够使其正常工作。我稍后会尝试回到此处并完成它。
此示例确实显示了如何使用RawSecurityDescriptor
类来进行"导入" SDDL,然后调用GetSDDLForm()
方法到" export"它回到了SDDL。我们需要弄清楚的是如何正确构造ObjectAce
对象,并在将它导出到SDDL之前调用InsertAce()
将其添加到RawSecurityDescriptor
对象。
# Create a Security Descriptor from SDDL
$SD = New-Object -TypeName System.Security.AccessControl.RawSecurityDescriptor -ArgumentList 'O:NSG:BAD:P(A;;GA;;;BA)(A;;GA;;;S-1-5-21-3231263931-1371906242-1889625497-1141)S:P(AU;FA;GA;;;WD)(AU;SA;GWGX;;;WD)';
# Add a new Access Control Entry
# ObjectACE constructor docs: http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.objectace.objectace(v=vs.110).aspx
$ArgumentList = @(
[System.Security.AccessControl.AceFlags]::None,
[System.Security.AccessControl.AceQualifier]::AccessAllowed,
1,
[System.Security.AccessControl.ObjectAceFlags]::None,
)
$ObjectACE = New-Object -TypeName System.Security.AccessControl.ObjectAce -ArgumentList $ArgumentList;
$SD.DiscretionaryAcl.InsertAce($ObjectACE);
# Convert the Security Descriptor back into SDDL
$SD.GetSddlForm([System.Security.AccessControl.AccessControlSections]::All);
答案 1 :(得分:1)
使用来自Trewor Sullivan的答案的信息,我设法添加以下代码:
function add_sid_with_A_GA($sddl, $sid) {
$security_descriptor = New-Object -TypeName System.Security.AccessControl.CommonSecurityDescriptor -ArgumentList @($false, $false, $sddl);
$security_descriptor.DiscretionaryAcl.AddAccess("Allow", $sid, 268435456,"None","None")
# Convert the Security Descriptor back into SDDL
$security_descriptor.GetSddlForm([System.Security.AccessControl.AccessControlSections]::All);
}
268435456
是GA权限的AccessMask。