Powershell SDDL 修改

3

我正在尝试通过WinRS允许远程访问服务器。在互联网上,我发现这需要修改winrm服务的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数组,修改它并解析回去?
2个回答

2

通过参考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权限的访问掩码。


1
这段代码并不完全可用,但如果你修复$ArgumentList变量中的构造函数参数(针对ObjectAce对象),它应该可以正常工作。稍后我会回来完成它。
这个示例展示了如何使用RawSecurityDescriptor类来“导入”SDDL,然后调用GetSDDLForm()方法将其“导出”回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);

你的意思是这个缺少适当的AccessMask吗?我在这里找到了Get-AccessMaskFromPermission函数:http://blogs.msdn.com/b/wmi/archive/2009/07/27/scripting-wmi-namespace-security-part-3-of-3.aspx - Bunyk
好发现 - 抱歉,在我填完这个想法之前,我必须去赴一个约会。 - user189198
1
你的回答仍然很有帮助,你可以将其完成以备将来使用。;) - Bunyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接