POWERSHELL將域中的計算機移動到指定OU


POWERSHELL處理域中計算機的過程

由於集團公司規模較大,存在幾個分公司並處在不同地理位置。采用域集中管理,各分公司都有自己的域控制器,分別負責各分公司的DNS解析,DHCP地址分配,及客戶端登錄。

 現在有這樣一個需求:

 將各分公司計算機按操作系統類型歸類存放到指定OU中,以便於部署域策略。

在沒有SCCM的情況下,聽說POWERSHELL可以做到,於是就試了一下,覺得可行。並將操作思路和執行過程記錄下來。

1. 通過各分公司的DHCP服務器導出各網段中的所有計算機輸出到EXCEL中處理只保留計算機名即可。

 

 

導出列表以后是TXT文件格式,至於導入到EXCEL當中如何分列這里就不講了。

  

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移動操作完畢**************************************************"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM