【发布时间】:2015-05-01 20:03:20
【问题描述】:
我需要生成我们网络上属于其工作站本地管理员组成员的所有用户的列表。我在这里找到了一个脚本https://gallery.technet.microsoft.com/scriptcenter/List-local-group-members-762b48c5#content,它通过Powershell 执行WMI 查询来列出本地组成员。我已经测试了这个脚本,它运行良好,但我一直在尝试修改它以获取要检查的计算机列表,这就是我遇到麻烦的地方。这是我所做的:
function LocalAdmins
{
param([string]$GroupName = "Administrators")
begin
{
# Get all workstations listed in this text file
$WorkStations = Get-Content -Path C:\useful_lists\testLocal.txt
# Initialize an array to hold the results of the query
$arr = @()
# hash table for storing computer name, member pairings
$hash = @();
}
process
{
foreach ($machine in $WorkStations)
{
$wmi = Get-WmiObject -ComputerName $machine -Query `
"SELECT * FROM Win32_GroupUser WHERE GroupComponent=`"Win32_Group.Domain='$machine',Name='$GroupName'`""
# Parse out the username from each result and append it to the array
if ($wmi -ne $null)
{
foreach($item in $wmi)
{
$arr += ($item.PartComponent.Substring($item.PartComponent.IndexOf(',') + 1).Replace('Name=', '').Replace("`"", ''))
}
}
# Return a hash table comprised of two columns: Computer Name & Members
$hash += @{ComputerName=$machine;Members=$arr}
}
}
end
{
return $hash
}
}
当我运行未修改的脚本时,这是我得到的输出:
PS > (Get-LocalGroupMembers -ComputerName "<COMPUTER NAME>" -GroupName "Administrators").Members
ACCOUNTNAME
ACCOUNTNAME
ACCOUNTNAME
PS >
但是,当我运行我修改的这个脚本的版本时,我得到了这个:
PS > (LocalAdmins -GroupName "Administrators").Members
PS >
我相当确定问题在于我如何设置第一个 foreach 循环来运行 wmi 查询,或者该查询的结果如何存储在哈希表中。我不确定我能做些什么来解决这个问题。
提前感谢任何可以提供帮助的人!
更新
根据 mortenya 的建议,我编辑了我的测试文本文件,使其仅包含一台计算机。这样做,连同取出 foreach ($machine in $computers) 循环按预期工作,产生以下结果:
>> LocalAdmins -GroupName "Administrators"
Name Value
---- ----
ComputerName {computerName.domain}
Members {account, account, account, account}
>>
但是,当使用上面的代码合并多台机器时,回过头来尝试让它工作(我从最初的帖子开始更新它),我得到以下信息:
>> LocalAdmins -GroupName "Administrators"
Name Value
---- -----
ComputerName computerName1.domain
Members {}
ComputerName computerName2.domain
Members {}
>>
为什么使用列表中的一台计算机可以获得管理员组的成员,但向列表中添加第二台计算机会导致我无法在任何一台计算机上检索该组的成员?
【问题讨论】:
-
这个
LocalAdmins -GroupName "Administrators"能得到什么?我也没有看到你初始化$hash。你可能只需要像$hash = @()这样的行 -
我知道您从脚本中心获得了该脚本,但我不明白为什么它会创建一个
$Workstations变量只是为了将其推入一个数组。我会只运行 WMI 查询,确保它返回你想要的。 -
嗨,马特,感谢您的意见。我编辑了帖子以显示我刚输入
LocalAdmins -GroupName "Administrators"时得到的结果。我还在 Begin{} 块中初始化了 $hash 数组,但是,这并没有解决问题。
标签: powershell remote-access wmi-query