![是否有解决方案可以用现有 SID 替换帐户未知 (S-1-5-21-*) SID](https://linux22.com/image/1303803/%E6%98%AF%E5%90%A6%E6%9C%89%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E5%8F%AF%E4%BB%A5%E7%94%A8%E7%8E%B0%E6%9C%89%20SID%20%E6%9B%BF%E6%8D%A2%E5%B8%90%E6%88%B7%E6%9C%AA%E7%9F%A5%20(S-1-5-21-*)%20SID.png)
我在许多来自旧/其他 Windows 安装的文件上都遇到了典型的“帐户未知”问题,到处都有大量典型答案。
但是,我并不是在寻找典型的takeown
、subinacl
或xcacls
GUI 解决方案。我想将这些未知的 SID 更改为已知的本地 SID,但保留权限类型和继承。
到目前为止,唯一接近我所寻找的是 PowerShell 脚本:http://poshcode.org/2081允许删除网络共享中的未知 SID。它包含查找未知 SID 的基本逻辑,但我尚未找到替换FileSystemAccessRule
对象中的 SID 的方法,但我对 PowerShell 或 .NET 不太熟悉。
如果我没记错的话,本文MS TechNet 上建议构建FileSystemAccessRule
并且可以完成。
有人知道是否有更好的解决方案吗? 也许有适合这项工作的应用程序、命令行工具或 cmdlet?
答案1
在 Powershell 中使用Get-Acl
,Set-Acl
您可以通过操作 SDDL 字符串来修改 ACL。
首先获取ACL对象。
$acl = Get-Acl -Path C:\YourFile.txt
现在获取 SDDL 字符串:
$sddl = $acl.sddl
现在,您可以将字符串中的 SID 替换为您想要的内容。这将使用正则表达式来更新部分匹配。
$sddl2 = $sddl -replace "S-1-5-21-[0-9-]+", "ExistingSIDHere"
然后更新 ACL 对象:
$acl.SetSecurityDescriptorSddlForm($sddl2)
然后设置对象的ACL:
Set-Acl -AclObject $acl -Path C:\YourFile.txt