1. 程式人生 > >PowerShell導出服務器本地Administrators組內成員

PowerShell導出服務器本地Administrators組內成員

管理員 基礎 歷史 end 不必要 討論 shell matches 很多

很久沒有上過51了,因為時間都花在了追女朋友上面,技術也都快荒廢了,前幾年一直做基礎架構運維的工作,也沒有太大的提升,現在轉做系統運維了,發現不懂Shell很吃虧,管理幾十臺服務器的時候,還能用人肉幹活,管理上百臺,上千臺服務器的時候,好鐵也打不了幾顆釘了。 公司有數千臺服務器,很多非IT運維人員都可以遠程登陸服務器,這樣的問題在每個公司多少應該都會存在,來源大概可以分為以下幾類: 1.運維制度不健全,任意有管理員權限的人都可以給其它人授予遠程訪問權限 2.運維人員工作懈怠,給僅需要查看權限的人員授權管理員權限 3.運維不嚴謹,臨時開放的權限,時間久了沒有回收,就變成了永久權限 4.歷史遺留問題等等 為了降低運維安全風險,決定將不必要的人員遠程登陸權限回收,經過分析討論,公司目前的服務器能夠遠程登陸的,可以分為這幾種權限: 1.域內Domain Admins組內成員 2.域內、本地Remote Desktop組內成員 3.域內、本地Administrators組內成員 域內成員非常容易獲取,方法很多,使用Powershell命令也比較方便,一條命令可以搞定,以導出Domain Admins成員為例

Get-ADGroupMember -Identity "domain admins" | Select-Object name,samaccountname | Export-Csv -Encoding utf8 c:\log\DomainAdminsMember.csv
#導出csv文件的時候,需要增加-Encoding utf8參數,用於導入中文字符
獲取本地組內成員的方法也蠻多,以導出Administrators為例,同樣使用Powershell
function get-user {
param ($computer)
$groups = Gwmi win32groupuser –computer $computer

$admins = $groups | where-object {$.groupcomponent –like ‘*"Administrators"‘}
#獲取groupcomponent屬性與Administrators字符相關的行數
$admins | ForEach-Object{
$.partcomponent –match “.+Domain\=(.+)\,Name\=(.+)$” > $nul
#這裏使用正則表達式,獲取並拿出匹配【.Domain="test",Name="Administrators"】的字符
$
.PSComputerName + “\”+$matches[1].trim(‘"‘) + “\” + $matches[2].trim(‘"‘)
#去掉分號,並把導出的字符以自己想要呈現的格式組合
}
}

$server_list = Get-Content C:\LOG\server.txt
foreach ( $hostname in $server_list){
if (!(test-connection $hostname -count 1 -quiet)){
Write-Output $hostname | Out-File C:\LOG\administrator-error.txt -Append}
#將無法ping通的服務器記錄在一個txt文件中
else{
get-user -strcomputer $hostname | Out-File C:\LOG\test\Administrator-users.txt -Append}
#導出Administrators組內的成員
}

PowerShell導出服務器本地Administrators組內成員