组织Active Directory帐户

时间:2015-06-18 10:30:49

标签: powershell active-directory organization ou

我正在尝试使用一个脚本来根据其显示名称组织我的活动目录帐户,因为我们的所有帐户都在其名称(或subOU)中包含其OU。我试图在PowerShell中的ForEach循环中使用If语句执行此操作。每次我运行它,它一直在问我一个身份。谁能帮我解决这个问题?这就是我的......

Import-Module ActiveDirectory
$OU = "OU=Test, OU=com"
$Test1OU = "OU=Test1, OU=Test, OU=Com"
$Test2OU = "OU=Test2, OU=Test, OU=Com"

$Users = (Get-ADUser -SearchBase $OU -Filter * -Properties samAccountName,DisplayName)
ForEach ($user in $users)
{
If ($($user.DisplayName -like ("*Supply*" -or "*Supplies*"))
{Move-ADObject -Identity $($user.samAccountName -TargetPath $Test1OU}
ElseIf ($($user.DisplayName -like ("*Accounting*" -or "*Accountant*"))
{Move-AdObject -TargetPath $Test2OU}
}

2 个答案:

答案 0 :(得分:0)

我目前无法测试,但这应该可以解决问题:

Import-Module ActiveDirectory

$OU = "OU=Test, OU=com"
$Test1OU = "OU=Test1, OU=Test, OU=Com"
$Test2OU = "OU=Test2, OU=Test, OU=Com"

$users = (Get-ADUser -SearchBase $OU -Filter * -Properties displayName)
foreach ($user in $users)
{
    if ($($user.displayName) -like "*Supply*" -OR $($user.displayName) -like "*Supplies*")){
        Move-ADObject -Identity $user -TargetPath $Test1OU
    }
    elseif ($($user.displayName) -like "*Accounting*" -OR $($user.displayName) -like "*Accountant*")) {
        Move-AdObject -Identity $user -TargetPath $Test2OU
    }
}

我已经为Move-ADObject添加了一个身份参数,我也改变了一些var名称以更好地反映他们的内容。

答案 1 :(得分:0)

你在这里遇到了一些问题

  1. 像Vesper说你没有传递任何东西到Move-ADObject因此你得到的错误
  2. $DisplayNames不是名称的字符串数组,而是具有displayname属性的对象。这就是-ExpandProperty FYI的Select-Object参数。
  3. 您正在拉动所有用户,但只是真的想要处理某些用户。而不是-Filter *让我们使用更有针对性的方法。
  4. 虽然它很诱人你不能嵌套-like这样的条件。如果您选择"*Supply*" -or "*Supplies*"并键入它将评估为true。与所有非零长度字符串相同。
  5. 对于我们计划进行的工作,我们不必解决所有这些问题。我们应该使用管道来帮助解决这个问题。根据你有多少差异,你可能会有更好的变化,如下所述。

    $supplyFilter = 'DisplayName -like "*Supply*" -or DisplayName -like "*Supplies*"'
    $accountFilter = 'DisplayName -like "*Accounting*" -or DisplayName -like "*Accountant*"'
    
    Get-ADUser -SearchBase $OU -Filter $supplyFilter -Properties displayName | Move-ADObject -TargetPath $Test1OU
    Get-ADUser -SearchBase $OU -Filter $accountFilter -Properties displayName | Move-ADObject -TargetPath $Test2OU
    

    您可能会对此感到不满,并使用过滤器和目标对在循环中创建自定义对象,这样您就不需要重复对每个Get-ADuser实例的cmdlet调用。

    $moves = @(
        @{
            Filter = 'DisplayName -like "*Supply*" -or DisplayName -like "*Supplies*"'
            OU = "OU=Test1, OU=Test, OU=Com"  
        },
        @{
            Filter = 'DisplayName -like "*Accounting*" -or DisplayName -like "*Accountant*"'
            OU = "OU=Test2, OU=Test, OU=Com"
        }
    ) | ForEach-Object{New-Object -TypeName PSCustomObject -Property $_}
    
    ForEach($move in $moves){
        Get-ADUser -SearchBase $OU -Filter $move.Filter -Properties displayName | Move-ADObject -TargetPath $move.OU
    }
    

    您应该可以通过添加新的$moves轻松扩展到此内容。使用PowerShell v3.0会更干净,但我不知道你有什么版本。

    使用开关

    如果你想要的东西更接近你现在所拥有的东西,我会建议这样的东西。

    $Users = Get-ADUser -SearchBase $OU -Filter * -Properties DisplayName
    ForEach ($user in $users){
        switch($user.DisplayName)  {
            ($_ -like "*Supply*" -or $_ -like "*Supplies*"){Move-ADObject -Identity $user -TargetPath $Test1OU}
            ($_ -like "*Accounting*" -or $_ -like "*Accountant*"){Move-ADObject -Identity $user -TargetPath $Test1OU}
        }
    }