我正在尝试调用Invoke-Command cmdlet中不需要其他参数的功能块。
$hostList = (Read-Host "Enter IP addresses/hostnames of hosts you want to connect to (Comma seperated)").Split(',');
foreach($_ in $hostList){
Invoke-Command -ComputerName $_ -Credential Administrator -ScriptBlock{$Function:PCInfo}
}
我的功能块看起来像这样(测试目的):
Function PCInfo{
$winVersion = gwmi -class Win32_OperatingSystem | select Caption,Version,CSName,OSArchitecture
$processorInfo = gwmi -class Win32_Processor | select Name,Manufacturer,MaxClockSpeed
$diskInfo = gwmi -class Win32_LogicalDisk | select @{Label=’Drive Letter’;Expression={$_.DeviceId}}, @{Label=’Size (GB)’;Expression={"{0:N2}" -f ($_.Size/1GB)}}, @{Label=’Free Space (GB)’;Expression={"{0:N2}" -f($_.freespace/1GB)}}
$routingTable = gwmi win32_IP4RouteTable | select Destination,Mask,@{Label=’Next Hop’;Expression={$_.NextHop}} -uniq | format-table
$timeObject = gwmi -class Win32_OperatingSystem
}
使用此代码时出现两个问题:
这不会导致任何输出。我搜索了SO并发现了类似的问题,但我只能找到类似的情况,其中函数使用其他参数。看到这是一个独立的功能类型,我无法弄清楚为什么它不起作用。
以普通用户身份运行此脚本时,会弹出凭据框。我填写管理员凭据,但是我收到以下错误:
[127.0.0.1]连接到远程服务器127.0.0.1失败,并显示以下错误消息:拒绝访问。*
我想知道为什么会这样,当我填写(本地)管理员凭证时?
答案 0 :(得分:0)
对于第一个问题,远程脚本的scope将无法理解本地函数或变量。也许试试这个:
# Create a ScriptBlock to contain the content.
$script =
{
# WinVersion
$WinVersion = gwmi -class Win32_OperatingSystem | select Caption,Version,CSName,OSArchitecture
# ProcessorInfo
$ProcessorInfo = gwmi -class Win32_Processor | select Name,Manufacturer,MaxClockSpeed
# DiskInfo
$DiskInfo = gwmi -class Win32_LogicalDisk | select @{Label=’Drive Letter’;Expression={$_.DeviceId}}, @{Label=’Size (GB)’;Expression={"{0:N2}" -f ($_.Size/1GB)}}, @{Label=’Free Space (GB)’;Expression={"{0:N2}" -f($_.freespace/1GB)}}
# RoutingTable
$RoutingTable = gwmi win32_IP4RouteTable | select Destination,Mask,@{Label=’Next Hop’;Expression={$_.NextHop}} -uniq
# TimeObject
$TimeObject = gwmi -class Win32_OperatingSystem
# Write all results to ScriptBlock's output
$WinVersion, $ProcessorInfo, $DiskInfo, $RoutingTable, $TimeObject
}
$hostList = (Read-Host "Enter IP Address or Host (Comma separated)").Split(',');
foreach($_ in $hostList)
{
$output = Invoke-Command -ComputerName $_ -Credential Administrator -ScriptBlock $script
#Output can be used in this scope before the next iteration of the loop.
$output
}
您也可以在远程脚本或pass content as an argument中定义该函数,但这似乎更实用,因为ScriptBlock只是这些gwmi调用的容器。收到后,您可以自行决定如何处理或使用该输出。请务必查看代码以获取有关范围的说明!
关于作为非管理员的powershell远程处理的第二个问题... see this Super User question。即使您具有访问远程计算机的管理员凭据,也需要从本地计算机配置非管理员远程处理(作为管理员)。