1

我正在尝试调用一个不需要 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
}

使用此代码时出现两个问题:

  1. 这不会导致任何输出。我搜索了 SO 并发现了类似的问题,但我只能找到函数使用附加参数的类似场景。看到这是一种独立类型的功能,我无法弄清楚为什么它不起作用。

  2. 以普通用户身份运行此脚本时,会弹出凭据框。我填写了管理员凭据,但出现以下错误:

凭据提示

[127.0.0.1] 连接到远程服务器 127.0.0.1 失败,并显示以下错误消息:访问被拒绝。*

当我填写(本地)管理员凭据时,我想知道为什么会发生这种情况?

4

1 回答 1

0

对于第一个问题,您的远程脚本的范围不会理解本地函数或变量。也许可以试试这个:

# 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
}

您还可以在远程脚本中定义函数,或将内容作为参数传递,但这似乎更实用,因为 ScriptBlock 只是这些 gwmi 调用的容器。收到输出后如何处理或使用输出由您决定。请务必检查代码以获取有关范围的注释!

对于您的第二个问题...请参阅此超级用户问题,以非管理员身份进行 powershell 远程处理。您将需要从本地计算机配置非管理员远程处理(作为管理员),即使您拥有访问远程计算机的管理员凭据。

于 2013-09-17T17:58:02.203 回答