延續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")
打完收工。