Invoke-Command功能块

时间:2013-09-17 17:40:40

标签: function powershell

我正在尝试调用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. 以普通用户身份运行此脚本时,会弹出凭据框。我填写管理员凭据,但是我收到以下错误:

  3. Credential prompt

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

    我想知道为什么会这样,当我填写(本地)管理员凭证时?

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。即使您具有访问远程计算机的管理员凭据,也需要从本地计算机配置非管理员远程处理(作为管理员)。