POWERSHELL将域中的计算机移动到指定OU

时间:2021-07-13 22:31:17

POWERSHELL处理域中计算机的过程

由于集团公司规模较大,存在几个分公司并处在不同地理位置。采用域集中管理,各分公司都有自己的域控制器,分别负责各分公司的DNS解析,DHCP地址分配,及客户端登录。

现在有这样一个需求:

将各分公司计算机按操作系统类型归类存放到指定OU中,以便于部署域策略。

在没有SCCM的情况下,听说POWERSHELL可以做到,于是就试了一下,觉得可行。并将操作思路和执行过程记录下来。

1. 通过各分公司的DHCP服务器导出各网段中的所有计算机输出到EXCEL中处理只保留计算机名即可。

POWERSHELL将域中的计算机移动到指定OU

导出列表以后是TXT文件格式,至于导入到EXCEL当中如何分列这里就不讲了。

POWERSHELL将域中的计算机移动到指定OU

2. 导出域中所有的计算机名和操作系统类型

a)         以管理员运行POWERSHELL,并导入域模块

PS C:\Windows\system32> Import-Module activedirectory

b)        运行如下代码:

 PS C:\Windows\system32> Get-ADComputer -filter * -properties name,operatingsystem | FT name,operatingsystem >d:\allpc.txt

命令说明:

Get-ADComputer              获取域中的计算机

-filter                                    过滤参数,*表示域中所有计算机,如果要在指定OU中查找可以将*改成 “ou=xxx,ou=xxx,dc=xxx,dc=com”

-properties                          属性过滤或显示,

Name                                   表示计算机名

OperatingSystem              表示操作系统的类型

FT                                          表示输出格式

最后就是重定向到一个文件,经过以上2步就把域中所有的计算机名和对应的操作系统类型输出到了TXT文件中,接着再导入到EXCEL。

3. 用EXCEL将从DHCP导出的计算机名和从域中导出的计算机作比较,找出所有操作系统类型是xp或win7,win8的计算机,这样就很容易得出属于各分公司的各类型的计算机名,将它们分别保存为xp.txt,win7.txt,win8.txt。

4. 使用POWERSHELL脚本读取TXT文件 并将文件中的计算机移动到相应的OU

脚本如下:

$a = Get-Content D:\citrix_Ctrl_test.txt #存放计算机名的文本文件
foreach($i in $a)
{
dsquery computer -name $i | dsmove -newparent "OU=citrix_other,OU=Servers,OU=Citrix,DC=cicdev,DC=com" #将计算机名移动到citrix_other OU下
}

5. Powershell默认情况下不允许任何脚本执行(安全考虑)可以通过如下修改:

PS C:\Windows\system32> Set-ExecutionPolicy UnRestricted

执行策略更改

执行策略可以防止您执行不信任的脚本。更改执行策略可能会使您面临 about_Execution_Policies

帮助主题中所述的安全风险。是否要更改执行策略?

[Y] 是(Y)  [N] 否(N)  [S] 挂起(S)  [?] 帮助 (默认值为“Y”): y

PS C:\Windows\system32>

6. 执行脚本

D:\ps> .\mpc_to_ou.ps1

7. 刷新一下域目录就可以看到相应的计算机都被移动到了新的OU当中

网上还有一个脚本在此转载过来供参考

#//*************************************************************

#//编辑人:

#//编辑单位:

#//编辑作用:移动计算机到对应的OU下

#//编制时间:2016.01.05

#//*************************************************************

#************获取当前脚本执行的目录

$Location = $PSScriptRoot

#**********************创建以yyyy-MM-dd的日志文件夹

$folderName ="Log"

#*********************全路径

$folderPath = $Location + "\" + $folderName

#*********************如果根文件夹不存在。则创建根文件夹

If((Test-Path $folderPath) -eq $False) {

         Write-Host "开始创建日志文件夹...---------------" -ForegroundColor Green

    New-Item -path $Location -name $folderName  -itemType "directory"

         Write-Host "创建日志文件夹完毕...---------------" -ForegroundColor Green

}

#**************************创建一个日志文件yyyy-MM-dd.txt

$DateTimeNow = Get-Date -Format 'yyyy-MM-dd'

$logFileName = $DateTimeNow.ToString() +".txt"

#**************************创建日志文件

$logFilePath = $folderPath + "\" + $logFileName;

If((Test-Path $logFilePath) -eq $False) {

         Write-Host "开始创建日志文件...---------------" -ForegroundColor Green

    New-Item -path $folderPath -name $logFileName -itemType "File"

         Write-Host "创建日志文件完毕...---------------" -ForegroundColor Green

}

#**************导入AD的PowerShell执行模块

Import-Module ActiveDirectory

#**************读取计算机文件TXT(格式一行一个)

$computerObjects = Get-Content d:\ps\zj_xp.txt

#*************要移动的计算机到目标的所在的OU

$TargetOUPath = "OU=xp_zj,OU=Remote Desktop Users,DC=sh-real,DC=com"

#*************得到服务名称

$serverName = $env:COMPUTERNAME

#*************开始循环读取的计算机文件

Add-Content -Path $logFilePath -Value "******************************************开始执行PowerShell移动操作**************************************************"

#******************循环

ForEach($computerObject in $computerObjects)

{

    #****************打印信息

    $PrintStart = "正在移动计算机【" + $computerObject +"】操作!"

    Write-Host $PrintStart -ForegroundColor Green

    #***************开始分析执行

    try

    {

        #********************得到源的OU

        $SrcOUPath =  Get-ADComputer $computerObject |select DistinguishedName -ExpandProperty DistinguishedName

        #********************打印出信息

        $PrintOk = "正在把计算机:【" + $computerObject + "】从原有OU:【" + $SrcOUPath + "】移动到目标OU:【" + $TargetOUPath +"】下"

        Write-Host $PrintOk -ForegroundColor Green

        #**********************得到要移动的计算机GUID,并移动到对应的OU下

        Get-ADComputer $computerObject | Move-ADObject -TargetPath $TargetOUPath

        #**********************记录移动的正确日志信息】

        $logConent = (Get-Date).DateTime.ToString() +"成功:在计算机名为:【" + $serverName +"】电脑上,把AD里的计算机【" + $computerObject+ "】从原有OU:【"+  $SrcOUPath +"】成功移动到目标OU下:【" + $TargetOUPath +"】下"

        #*********************写入日志

        Add-Content -Path $logFilePath -Value $logConent

    }

    catch

    {

        #*************************打印错误信息

        $PrintError = "移动的计算机【" + $computerObject +"】在AD不存在,请联系AD管理员核对!"

        Write-Host $PrintError -ForegroundColor Red

        #************************记录错误日志信息

        $FailContent = (Get-Date).DateTime.ToString() +"失败:在计算机名为:【" + $serverName +"】电脑上进行获取操作,在AD中无法获取到计算机【"+ $computerObject +"】的信息,请与AD管理员联系!"

        #************************写入失败日志

        Add-Content -Path $logFilePath -Value $FailContent

    }

}

#****************************************执行完毕

Add-Content -Path $logFilePath -Value "******************************************执行PowerShell移动操作完毕**************************************************"