【发布时间】:2012-03-16 06:39:25
【问题描述】:
我正在使用一些 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,设置 ACL,即使 SID 是 无效的?
- 如果 EMC Celerra 是问题(我认为是),是否有任何问题? 我可以强制它更新其“SID 缓存”或其他任何可能的方式吗?
我有 read various articles 关于这个问题,但似乎没有一个有效的解决方案(或为我工作)。
感谢您的帮助。
里斯。
【问题讨论】:
标签: powershell active-directory filesystems acl sid