我正在使用http://iislogs.com/steveschofield/2009/01/09/list-local-administrators-on-a-machine-using-powershell-adsi/中的以下Powershell来解压缩在PC和内部网络服务器中配置的本地和域管理员帐户。
Powershell脚本如下:
function LogToFile ([string]$strFileName, [string]$strComputer)
{
Add-Content $strFileName $strComputer
}
$strComputer = “server1.loc.mydomain.com”
$computer = [ADSI](“WinNT://” + $strComputer + “,computer”)
$Group = $computer.psbase.children.find(“Administrators”)
$members= $Group.psbase.invoke(“Members”) | %{$_.GetType().InvokeMember(“Name”, ‘GetProperty’, $null, $_, $null)}
ForEach($user in $members)
{
Write-Host $user
$a = $strComputer + “!” + $user.ToString()
LogToFile “C:\local-admins.txt” $a
}
执行时,它会以下列格式在txt文件中生成结果:
server1.loc.mydomain.com!Administrator
server1.loc.mydomain.com!JohnDoe
server1.loc.mydomain.com!Support
server1.loc.mydomain.com!Domain Administrators
有人可以帮我改变txt文件的输出,所以结果会以这种格式显示:
server1.loc.mydomain.com!Administrator!JohnDoe!Support!Domain Administrators
如果以这种方式报告,那么我可以轻松导出到csv并使用它。 如果可以将其转换为以所需格式而不是txt导出CSV,那就太酷了。
我是PS中的一个完整的新手,但是试图把事情拼凑起来满足我的需求,并希望你能为我提供所需的帮助。
感谢。
答案 0 :(得分:1)
要更改输出以使所有帐户都在一行中,请将底部的foreach()
循环更改为:
$a = @($strComputer;$members) -join '!'
LogToFile "C:\local-admins.txt" $a
要生成名称中包含连续编号的服务器列表,请使用范围运算符..
:
$serverNames = foreach($number in 1..38){
'server{0}' -f $number
}
所以你最终得到的结果是:
function LogToFile ([string]$strFileName, [string]$strComputer)
{
Add-Content $strFileName $strComputer
}
foreach($ServerNumber in 1..38){
$ServerName = 'server{0}.loc.mydomain.com' -f $ServerNumber
$Computer = [ADSI]("WinNT://$ServerName,computer")
$Group = $Computer.psbase.children.Find('Administrators')
$Members= $Group.psbase.invoke('Members') |ForEach-Object { $_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null) }
$Output = @($ServerName;$members) -join '!'
LogToFile 'C:\local-admins.txt' $Output
}