[PowerShell] 將AD group加入某一台Server的群組中

延續DBA減化工作繁瑣﹝偷懶?﹞的大業...,

還是要強調一下我們管理的Server非常的多,為了減少遠端連線的時間﹝偷懶?﹞,

想到要用PowerShell來實現把一些User的單位直接加到Server中的某些群組中﹝ex. Administrators﹞,

之前已經有把User加進去的經驗了,想說加Group應該也不是問題,

來複習一下加入User的語法,

$ComputerName = Read-Host "ComputerName"
$LocalGroup = Read-Host "LocalGroup"
$user = Read-Host "UserName"
$domain = 'DMTest'
([ADSI]"WinNT://$ComputerName/$LocalGroup,group").add("WinNT://$domain/$user,group")

那換成Group的話,想當然爾,當然寫成底下的語法應該就可以了,

$ComputerName = Read-Host "ComputerName"
$LocalGroup = Read-Host "LocalGroup"
$group = Read-Host "GroupName"
$domain = 'DMTest'
([ADSI]"WinNT://$ComputerName/$LocalGroup,group").add("WinNT://$domain/$group,group")

結果就撞牆了...

以 "1" 引數呼叫 "add" 時發生例外狀況: "無法將成員加入本機群組或從本機群組移除,因為成員不存在。"
位於 線路:5 字元:1
+ ([ADSI]"WinNT://$ComputerName/$LocalGroup,group").add("WinNT://$domain/$group,gr ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

幾次測試後發現,有些群組是可以的,有些不行,終於發現共同的特性是,有問題的GroupName實際的名稱是有帶中文字的...﹝ex. TestGroup 測試群組﹞

 

當然,我可以透過Exchange去查到完整的名稱,

但我怎麼可能允許已經要用PowerShell偷懶了,還要再去查群組的完整名稱再貼進來呢,

實際上,我所習慣打的TestGroup是一個別名,因此可以透過以下的方法,去AD上取得完整名稱,

Get-ADGroup -Filter {mailNickname -eq $ShortGroupName} -Properties * | Select-Object -ExpandProperty displayname

記得後面不能直接用Select displayname,不然除了displayname以外,你還會多取得一個叫displayname的Title,

因此,整串程式碼最後會變成以下的樣子,

$group = Read-Host "GroupName"
$FullName = Get-ADGroup -Filter {mailNickname -eq $group} -Properties * | Select-Object -ExpandProperty displayname
$ComputerName = Read-Host "ComputerName"
$LocalGroup = Read-Host "LocalGroup"
$domain = 'DMTest'
([ADSI]"WinNT://$ComputerName/$LocalGroup,group").add("WinNT://$domain/$FullName,group")

打完收工。