【问题标题】:Bulk hostname movement to desired OU将主机名批量移动到所需的 OU
【发布时间】:2021-04-14 19:54:50
【问题描述】:

我有一个用于将主机名移动到特定 OU 的脚本。

gc .\list.txt |ForEach-Object { Get-ADComputer $_ |移动广告对象-targetpath "" }

在上面的脚本中实际上有 150 个主机名并且需要移动不同的不同的 ou。我们如何做到这一点。

例子。

masuadfl01  --   move to  masu/branches/laptops
masufgd002  --   move to  masu/branches/desktops
abdufghd001  --  move to  abdu/branches/desktops

像上面的一切都应该自动移动正确的OU。我们如何创建这样的脚本。

如果它是数字 D 之前的最后一个桌面。对于笔记本电脑 L 会。

【问题讨论】:

  • 您的答案存在一些格式问题。尝试改进它。使用` 括号表示路径和代码片段。要突出显示应用的名称或界面,请使用 粗体** 括号)或 斜体* 括号)字体。要从新行开始,请在行尾使用 double space - 这个问题会比在任何地方使用 Enter 更清楚。添加一些: 也很好。

标签: powershell server active-directory


【解决方案1】:

这里的开销有点大,但您可以为此使用正则表达式

首先,设置正则表达式

# will match a d,l,D or L character before the digit
[regex]$regex = "[dlDL](?=\d)"

然后你可以遍历你的主机名列表

Get-Content -Path .\list.txt | ForEach-Object {
    
    # check if the hostname matches the regex
    $match = $regex.Match($_)
    
    # get the desired OU, first 4 characters
    $desiredOU = $_.Substring(0,4)

    If($match.Success){
        # if client is L -> move to laptops
        If($match.Value.ToUpper() -eq "L"){
            Write-Host "$_ is a laptop" -ForegroundColor Green
            Get-ADComputer $_ | Move-ADObject -TargetPath "OU=laptops,OU=branches,OU=$desiredOU,DC=Contoso,DC=com"
        # if client is D -> move to desktops
        }Elseif($match.Value.ToUpper() -eq "D"){
            Write-Host "$_ is a desktop" -ForegroundColor Green
            Get-ADComputer $_ | Move-ADObject -TargetPath "OU=desktops,OU=branches,OU=$desiredOU,DC=Contoso,DC=com"
        }Else{
            Write-Host "$_ not a laptop nor desktop" -ForegroundColor Red
        }
    }Else{
        Write-Host "$_ not a laptop nor desktop" -ForegroundColor Red
    }
}

【讨论】:

  • 先生,每个 L 都应该在笔记本电脑中,但我们也必须检查前 4 个字母。在我的示例中,masu 也意味着去 masu ou abdu 意味着去 abdu ou.. 根据您的代码每个 L先生,我会去同样的。感谢您的帮助。
【解决方案2】:

我不会使用仅列出计算机名的文本文件,而是为此创建一个包含两列的 CSV 文件。
第一列包含计算机名称,第二列包含要将计算机移动到的 OU 的 DistinguishedName

"ComputerName","Destination"
"masuadfl01","OU=laptops,OU=branches,OU=masu,DC=Contoso,DC=com"
"masufgd002","OU=desktops,OU=branches,OU=masu,DC=Contoso,DC=com"
"abdufghd001","OU=desktops,OU=branches,OU=abdu,DC=Contoso,DC=com"

那么你的代码可能是这样的:

Import-Csv -Path 'Path\To\The\File.csv' | ForEach-Object {
    Get-ADComputer $_.ComputerName | Move-ADObject -TargetPath $_.Destination
}

编辑

如果计算机名称中涉及某种固定策略,那么您可以利用它来确定目标 OU,而不必创建 CSV 文件。
例如:如果所有计算机名称都以 masuabdu 开头,并且这是其中一个子 OU 的名称,则可以将其用作变量。
对于台式机或笔记本电脑,每个名称都有一个 ld 字符作为最终数字,如果确实表明它是笔记本电脑或台式计算机,我们可以使用它来使 OU 的专有名称完整:

# create a template OU distinguished name string
$targetOU = "OU={0},OU=branches,OU={1},DC=Contoso,DC=com"

Get-Content -Path 'Path\To\The\ComputerNamesFile.txt' | ForEach-Object {
    $subOU = $_.Substring(0,4)
    if ($_ -match '([ld])\d+$') { 
        $type = switch ($matches[1]) {
            'l'  { 'laptops'; break }
            'd'  { 'desktops' }
        }
        $moveTo = $targetOU -f $type, $subOU
        Get-ADComputer $_ | Move-ADObject -TargetPath $moveTo
    }
    else {
        Write-Warning "Cannot determine the computertype for '$_'"
    }
}

【讨论】:

  • 默认情况下它将在计算机中正确。我需要移动不同 OU 中的所有主机名。不一样的欧。有超过 55 个 OU,而不是给出这个完整的目标名称,我们可以使用任何 if 或 for 循环并使脚本变得简单......
  • @Masyood 这就是您需要 csv 的原因,这样您就可以将每台计算机映射到其新的目标 OU
  • 好的。非常感谢您的努力。我们每天有超过 150 个主机名需要移动。并且将超过 55 个 OU,因此我们必须正确地做手工工作才能制作 excel。或者我们可以使用其他任何技术来简化它。
  • @Masyood 如果计算机名称中涉及某种恒定策略,那么您可以利用它来确定目标 OU。就像如果它们都以 masuabdu 开头并且这是其中一个 OU 的名称,您可以将其用作变量。至于台式机或笔记本电脑,我可以看到每个名称中最后一个数字之前都有一个ld。这是偶然还是真的表示机器类型?
猜你喜欢
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 2016-03-09
相关资源
最近更新 更多