我正在使用一些 PowerShell 代码来动态生成 AD 安全组,然后将它们应用于网络共享上的文件夹,但是在解析新创建的组时遇到了问题。
考虑一下:
import-module activedirectory
for ($i = 0; $i -lt 10; $i++) {
$group = New-ADGroup -Path "OU=Groups,OU=Department,DC=Domain,DC=Network" -Name "z-test-group-$i" -GroupScope DomainLocal -GroupCategory Security -PassThru
$acl = Get-Acl C:\Temp
$permission = $group.SID,"FullControl","Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
$acl | Set-Acl C:\Temp
}
哪个工作正常。
但是,如果我将文件夹更改为网络文件夹,例如 G:\Temp 或 \\domain.network\DFS\GroupShare\Temp,我会收到“方法失败,出现意外错误代码 1337”。
我厌倦了使用 SetACL.exe 并收到类似的错误:
C:\Temp\SetACL.exe -on "\\domani.network\dfs\GroupShare\Temp" -ot file -actn ace -ace "n:$GroupSID;p:full;s:y"
SetACL finished with error(s):
SetACL error message: The call to SetNamedSecurityInfo () failed
Operating system error message: The security ID structure is invalid.
INFORMATION: Processing ACL of: <\\?\UNC\domain.network\dfs\GroupShare\Temp>
如果我等待 10 到 20 秒,然后再次运行代码的 Set-ACL(或 SetACL.exe)部分,它将成功完成。
起初我认为这与域控制器直接相关(其中 4 个是 2003 和 2008 R2 的混合),但它在本地文件夹上运行良好的事实很有趣(也很烦人)。
在本地文件夹和网络文件夹上执行代码期间,我进行了 Wireshark 跟踪。主要区别在于尝试将 ACL 应用于网络文件夹时,我看到 LDAP 查找和(除其他外)以下 SMB 响应:
NT Trans Response, FID: 0x0040, NT SET SECURITY DESC, Error: STATUS_INVALID_SID
我认为这是导致我的 Set-ACL 命令失败的原因。
底层网络文件系统是 EMC Celerra 6.0.xx。我对这项技术非常不熟悉,但是据我了解,它拥有某种 SID 缓存,可以解释上述错误(即使 AD 知道,它还不知道新组)。
所以我想有两个问题:
- 是否有任何不涉及睡眠/等待的解决方法(PowerShell/C# 等)?IE,即使SID无效也要设置ACL?
- 如果 EMC Celerra 是问题(我认为是),有什么方法可以强制它更新其“SID 缓存”或其他任何可能的问题?
我已阅读有关此问题的 各种 文章,但似乎都没有有效的解决方案(或对我有用)。
谢谢你的帮助。
里斯。