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