Powershell脚本获取多个远程PC上的本地管理员列表

kqhtkvqz  于 12个月前  发布在  Shell
关注(0)|答案(2)|浏览(155)

我几乎有这个,但得到一个错误时,通过逗号分隔的提示输入输入多个计算机名称。

$hostname = Read-Host -Prompt "Enter PC names (separated by comma)"
Invoke-Command -ComputerName $hostname -ScriptBlock{Get-LocalGroupMember -Group "Administrators"} | Export-Csv C:\temp\localadmins.csv

字符串
在没有Read-Host提示符的情况下运行它时,它可以很好地输入逗号分隔的多个计算机名,但当使用提示符输入并输入多个计算机名时,它会返回“一个或多个计算机名无效”。我希望将$hostname从输入转换为-ComputerName,就像它在输入中键入的那样,但我想我错过了一些东西。
错误输出:

Enter PC names (separated by comma): computername1, computername2
Invoke-Command : One or more computer names are not valid. If you are trying to pass a URI, use the -ConnectionUri parameter, or pass URI objects 
instead of strings.
At \\usblfs003.global.baxter.com\users$\parksd2\docs\Scripts\LocalAdminsExport_EntitlementReview.ps1:2 char:1
+ Invoke-Command -ComputerName "$hostname" -ScriptBlock{Get-LocalGroupM ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (System.String[]:String[]) [Invoke-Command], ArgumentException
    + FullyQualifiedErrorId : PSSessionInvalidComputerName,Microsoft.PowerShell.Commands.InvokeCommandCommand

dy2hfwbg

dy2hfwbg1#

在没有Read-Host提示符的情况下运行它时,输入逗号分隔的多个字符也可以正常工作
这是因为类似以下的东西:

Invoke-Command -ComputerName server1, server2 -ScriptBlock …

字符串
使用array literal(通过,数组构造函数运算符)指定绑定到Invoke-Command小程序的[string[]]类型-ComputerName参数的各个计算机名称。
相比之下,
Read-Host返回的 * 总是一个字符串 *(一个[string]示例),因此使用用户输入server1, server作为对Read-Host提示的响应等效于使用
… -ComputerName 'server1, server2' …
which cannot work:它告诉Invoke-Command查找名称为 verbatimserver1, server2的 * 单个 * 计算机

**要将 string 解释为由 separator 分隔的 list of values,您需要 * 显式地将其转换为数组 *:

# Simulate a Read-host call
$hostnameListString = 'server1, server2'

# Convert the user input to an *array*
$hostnames = ($hostnameListString -split ',').Trim()

# Now you can pass the $hostnames array to Invoke-Command
Invoke-Command -ComputerName $hostnames -ScriptBlock {
  Get-LocalGroupMember -Group Administrators
} |
  Export-Csv C:\temp\localadmins.csv


注意事项:

  • -split ','使用-split运算符将输入字符串按,拆分为标记
  • .Trim()应用于生成的标记 * 数组 *,使用member-access enumeration从每个元素中去除任何前导或尾随空格。
wlzqhblo

wlzqhblo2#

$ADComputers = Get-ADComputer -Filter * | Select-Object Name
foreach ($ADComputer in $ADComputers)
    {
    $ComputerName = $ADComputer.Name
    Write-Host -Object "Processing groups on $ComputerName" -ForegroundColor Cyan
    Invoke-Command -ComputerName $ComputerName -ScriptBlock {Get-LocalGroup -Name Administrators | ForEach-Object {Get-LocalGroupMember -Group $_.Name}} -ErrorAction SilentlyContinue
    }

字符串

相关问题