0

我正在使用一些 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 知道,它还不知道新组)。

所以我想有两个问题:

  1. 是否有任何不涉及睡眠/等待的解决方法(PowerShell/C# 等)?IE,即使SID无效也要设置ACL?
  2. 如果 EMC Celerra 是问题(我认为是),有什么方法可以强制它更新其“SID 缓存”或其他任何可能的问题?

我已阅读有关此问题的 各种 文章,但似乎都没有有效的解决方案(或对我有用)。

谢谢你的帮助。

里斯。

4

2 回答 2

0

如果问题只是等待缓存更新阻塞脚本需要执行的其他工作所涉及的延迟,您可以将其发送到后台作业并让您的主脚本继续执行其他操作。

于 2012-03-15T03:13:33.370 回答
0

弄清楚了!

修改了我们的 EMC Celerra NAS 上的acl.mappingErrorAction 。

设置为 0,更新为 1。

server_param server_2 -facility cifs -modify acl.mappingErrorAction -value 1

现在我们将新创建的安全组设置到网络共享文件夹的 ACL 中没有问题(没有延迟)。


信息:acl.mappingErrorAction

定义 ACL 设置上安全、用户和组标识符 (SID/UID/GID) 之间未知映射的规则。

可能会出现两种错误: ACL 中设置的 SID 对正在使用的域控制器是未知的。用户名尚未映射到 UID/GID。

位列表由四个二进制位(位 0 到 3,从右到左)组成。设置时每个位为 1;否则为 0。

Bit 0 (0001 or +1): Store unknown SID.
Bit 1 (0010 or +2): Store SID with no UNIX mapping.
Bit 2 (0100 or +4): Enable debug traces.
Bit 3 (1000 or +8): Do lookup only in cache (secmap or global SID cache or per connection SID cache).

值:0 – 15 默认值:0


现在似乎很明显,因为我对 NAS 上的底层 CIFS/ACL 设置有了更多的了解,然后我才想知道。

里斯。

于 2012-03-15T22:39:25.557 回答