我正在编写一个脚本来创建安全和通讯组,以便他们遵循我们的命名标准。在脚本中,我使用New-DistributionGroup创建组,Set-DistributionGroup添加一些Custom属性,然后使用Set-ADGroup添加Description。 (除此之外:New-DistributionGroup不能做这些事情的痛苦!)尽管设置睡眠时间长达30秒,Set-ADGroup总是失败:
Set-ADGroup:找不到具有身份的对象: [我们的域名] 下的“ AcctTesting1 ”。
然而,如果我从Set-ADGroup中删除代码行,运行脚本,然后立即运行Set-ADGroup代码,它可以很好地工作。
以下是该脚本的相关部分:(我们删除了域名)
$GroupTypeName = "Assignment"
$OU = $BaseOU + "AssignmentGroups"
New-DistributionGroup -Name $SAMname -Alias $Alias -DisplayName $DisplayName -ManagedBy `
"CN=Administrator,CN=Users,[our domain]" -OrganizationalUnit $OU `
-SamAccountName $SAMname -Type Security
Set-DistributionGroup -Identity $SAMname -CustomAttribute10 "ASSIGNMENT GROUP" `
-CustomAttribute11 $PRMCode
echo "Waiting for new group to replicate"
Start-Sleep -s 20
Set-ADGroup -Identity $SAMname -Description "$Alias AssignmentGroup"
我对PowerShell脚本编程比较陌生,所以如果你有关于如何解决这个问题的想法,我会很感激一点!
答案 0 :(得分:1)
我无法测试它,但这是一个可能的解释。
New-DistributionGroup
是一个Exchange Cmdlet,用于创建通用组。通用组是在拥有全局编录的域控制器上创建的。 Set-ADGroup
是一个活动的目录Cmdlet,它尝试在任何域控制器上查找组。
因此,您遇到问题的一个原因是您必须等待从GC复制到指定的域控制器。您可能尝试在具有全局编录的控制器上运行脚本来测试它。
答案 1 :(得分:1)
这是你可以尝试的,
您可以指示New-DistributionGroup
在特定DC上创建组(使用DomainController参数)。 New-DistributionGroup
会发出该组,因此您可以将该组管道传输到Set-DistributionGroup
并设置所需的属性。最后,您可以使用Set-ADGroup
-Server参数从DC获取组。
New-DistributionGroup -DomainController DC1 -Name $SAMname ... | Set-DistributionGroup -CustomAttribute10 "ASSIGNMENT GROUP" -CustomAttribute11 $PRMCode
Set-ADGroup -Server DC1 -Description "$Alias AssignmentGroup"
答案 2 :(得分:0)
本网站收到的信息向我展示了错误发生的原因,但我仍然需要修复它。另一位网站专家建议使用循环结构来执行,直到该组可用。他的解决方案有效,但在循环的每次迭代中都会在屏幕上显示错误消息。下面的帖子给了我建立工作循环所需的信息。
https://stackoverflow.com/a/9421291/1299495
执行New-DistributionGroup命令后,此循环会延迟后续命令,直到刚刚创建的组可用于修改。
Write-Host -NoNewline "Waiting for replication"
Do
{
If($Idx -gt 0) {Start-sleep -s 5}
$r = Get-ADGroup -Filter {SamAccountName -eq $SAMname}
Write-Host -NoNewline "."
$Idx = $Idx + 1
}
Until($r)
达恩
答案 3 :(得分:0)
我也有这个问题,因为我使用该组进行远程文件系统ACL,我想确保该组在所有DC上同步。
在上面的基础上,我的实现实际上是
function createADSecurityGroup{
Param( [Parameter(mandatory = $true)] [String] $GroupScope,
[Parameter(mandatory = $true)] [String] $Name,
[Parameter(mandatory = $true)] [String] $Description,
[Parameter(mandatory = $true)] [String] $Path)
try{
New-ADGroup -GroupScope $GroupScope -Name $Name -Description $Description -GroupCategory Security -Path $Path
foreach( $dc in Get-ADDomainController -Filter * | Select-Object name){
$Idx=0
$MaxTries=99
$timeout=$false
Write-Host -NoNewline "`nWaiting for group " $name " to appear on server " $dc.name
Do {
If($Idx -gt 0) {Start-sleep -s 5}
try{
$r=$null
$r = Get-ADGroup -Server $dc.name -Filter {SamAccountName -eq $name }
#Timeout-Error-Similation #$r = Get-ADGroup -Server $dc.name -Filter {SamAccountName -eq 'NoNe'}
Write-Host -NoNewline "."
$Idx = $Idx + 1
if( $Idx -gt $MaxTries ){
$timeout=$true
throw "Timeout waiting for appearance of group "
}
}catch{
$ErrorMessage = $_.Exception.Message
Write-Host $ErrorMessage
if( $timeout ){
throw $ErrorMessage
}
}
}
Until($r)
}
Write-Host ""
}catch{
$ErrorMessage = $_.Exception.Message
$txt="createADSecurityGroup-Function FAILURE: "+$ErrorMessage+" "+$Name
Write-Host "`n" $txt
throw $txt
}
}