用于在网络上列出本地管理员的 Powershell
Powershell for listing local admins on network
我正在使用 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 上,那就太棒了。
- 如何在第 6 行制作代码,例如如果我想扫描具有名称的整个子网:server1、server2、.... server38...我不必为每台机器手动更改该行。我尝试了服务器*、服务器[*],但它给了我错误。
我在 PS 方面完全是个新手,但我正在努力拼凑各种东西来解决我的需求,希望您能为我提供所需的帮助。
谢谢。
要将输出更改为在一行中显示所有帐户,请将底部的 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
}
我正在使用 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 上,那就太棒了。
- 如何在第 6 行制作代码,例如如果我想扫描具有名称的整个子网:server1、server2、.... server38...我不必为每台机器手动更改该行。我尝试了服务器*、服务器[*],但它给了我错误。
我在 PS 方面完全是个新手,但我正在努力拼凑各种东西来解决我的需求,希望您能为我提供所需的帮助。
谢谢。
要将输出更改为在一行中显示所有帐户,请将底部的 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
}