简体   繁体   English

如何从计算机 OU 中动态移动计算机帐户

[英]How to dynamically move computer accounts from Computers OU

Its pretty "simple" what i want to achieve.我想要实现的非常“简单”。 I have people creating Computer Objects on my AD and leaving there without moving them to the appropiate OU.我有人在我的 AD 上创建计算机对象并离开那里而不将它们移动到适当的 OU。

I would like a powershell script to read the list of computers from the Computers OU, and depending the first 5 or 6 letters from the Computer name, move it to the appropiate OU, reading the list of destination OUs from a CSV or txt or whatever file type.我想要一个 powershell 脚本来读取计算机 OU 中的计算机列表,并根据计算机名称中的前 5 个或 6 个字母,将其移动到适当的 OU,从 CSV 或 txt 或其他任何内容中读取目标 OU 列表文件类型。

I need to move more than 100 computers and I would like to scan them, and move them to their corresponding OU.我需要移动 100 多台计算机,我想扫描它们,并将它们移动到它们对应的 OU。

I've thought to use a variable for the computer accounts, then a foreach and a switch or something similar, and 1-by-1 start moving the accounts.我曾想过为计算机帐户使用一个变量,然后是一个foreach和一个switch或类似的东西,然后 1-by-1 开始移动帐户。 But I'm stuck.但我被困住了。

Thank you!!!!谢谢!!!!

This should be dynamic enough.这应该足够动态。 You can replace the Map object with a CSV.您可以用 CSV 替换 Map object。

$Map = [PSCustomObject]@{
        AABBCC = "OU=ABC,DC=Contoso,DC=com";
        CCBBAA = "OU=CBA,DC=Contoso,DC=com"
    }

    $Prefixlist = ($Map.PSObject.Members | Where-Object { $_.MemberType -eq "NoteProperty" }).Name
    $Report = @()
    $MissingPrefix = @()

    Get-ADComputer -filter * -searchbase "CN=Computers,DC=Contoso,DC=com" -Properties Name | ForEach-Object {
        $obj = $_
        $Prefix = ($obj.Name).Substring(0, 6)
        if ($Prefixlist -contains $Prefixlist) {
            try {
                $obj | Move-AdObject -Targetpath $Map.$Prefix -erroraction stop
                $Report += [PSCustomObject]@{
                    Name = $Obj.Name
                    Move = $true
                }
            }
            catch {
                $_.Exception.ErrorRecord
                $Report += [PSCustomObject]@{
                    Name = $Obj.Name
                    Move = $false
                }
            }

        }
        else {
            $MissingPrefix += $Prefixlist
            $Report += [PSCustomObject]@{
                Name = $Obj.Name
                Move = $false
            }
        }
    }

    "Result"
    $Report | Format-Table -AutoSize

    "Not found prefix list"
    $MissingPrefix

Option 2 to make the path based on the prefix选项 2 根据前缀创建路径

$Report = @()

Get-ADComputer -filter * -searchbase "CN=Computers,DC=Contoso,DC=com" -Properties Name | ForEach-Object {
    $obj = $_
    $Prefix = ($obj.Name).Substring(0, 6)

    try {
        $obj | Move-AdObject -Targetpath "OU=Computers,OU=$Prefix,DC=Contoso,DC=com" -erroraction stop
        $Report += [PSCustomObject]@{
            Name = $Obj.Name
            Move = $true
        }
    }
    catch {
        $_.Exception.ErrorRecord
        $Report += [PSCustomObject]@{
            Name = $Obj.Name
            Move = $false
        }
    }

}


"Result"
$Report | Format-Table -AutoSize

Turning my comment into an answer.将我的评论变成答案。 You could create a lookup Hashtable for this:您可以为此创建一个查找哈希表:

# create a lookup Hashtable for all OU's in your organisation
# You can limit this using parameters like '-SearchScope' and '-SearchBase' depending on the structure in your AD environment
$allOUs = @{}
Get-ADOrganizationalUnit -Filter 'Name -like "*"' | ForEach-Object {
    $allOUs[$_.Name] = $_.DistinguishedName 
}

# next, get all computers in the default Computers OU
$result = Get-ADComputer -Filter * -SearchBase "CN=Computers,DC=Contoso,DC=com" | ForEach-Object {
    $computerName = $_.Name
    $found = $false
    if ($computerName.Length -ge 6) {
        $targetOU = $computerName.Substring(0,6)
        $found    = $allOUs.ContainsKey($targetOU)
    }
    if (!$found -and $computerName.Length -ge 5) {
        $targetOU = $computerName.Substring(0,5)
        $found    = $allOUs.ContainsKey($targetOU)
    }
    if ($found) {
        try {
            $_ | Move-ADObject -TargetPath $allOUs[$targetOU] -ErrorAction Stop -WhatIf
            # add success to the $result
            [PsCustomObject]@{
                'Computer' = $computerName
                'TargetOU' = $targetOU
                'Result'   = 'Moved'
            }
        }
        catch {
            # add exception to the $result
            [PsCustomObject]@{
                'Computer' = $computerName
                'TargetOU' = $targetOU
                'Result'   = 'Not moved. {0}' -f $_.Exception.Message
            }
        }
    }
    else {
        # add failure to the $result
        [PsCustomObject]@{
            'Computer' = $computerName
            'TargetOU' = ''
            'Result'   = 'Not moved. Computername does not begin with a valid OU name'
        }
    }
}

# output on screen
$result

# output to file
$result | Export-Csv -Path 'ComputersMoved.CSV' -NoTypeInformation

Remove the -WhatIf switch if you are satisfied with the results shown in the console.如果您对控制台中显示的结果感到满意,请移除-WhatIf开关。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM