通过PowerShell一次重新启动AD计算机

时间:2015-11-11 03:41:16

标签: powershell

我需要一次重启AD中的所有计算机(不包括我的计算机),确认每个计算机已重新启动,然后重新启动下一个计算机。系统重启后,我想查看它的IP地址和名称。以下是我的尝试,但我认为我做错了,因为它不起作用。我收到的主要错误是:

 Get-WMIObject: cannot validate argument on parameter 'computerName'. The argument is null or empty
 + $serverobj = gmi Win32_operatingsystem -computername $i.server

代码:

$servers= Get-ADComputer -Filter * | Select-Object -ExpandProperty name

foreach($i in $servers) {
 Write-Host "Rebooting:" $i.server "..."

 $serverObj = gwmi Win32_operatingsystem -computer $i.server

 $status = $serverObj.reboot()

 if ($status.ReturnValue = "0") {
      Write-Host "Reboot successful."
 } else {
      Write-Host "Reboot failed."
 }
do {
    Start-Sleep -s 2 }  # this will wait for 2 seconds 
while (Test-Connection $servers -count 1 | select @{Name="Computername";Expression={$_.Address}},Ipv4Address)
}

1 个答案:

答案 0 :(得分:4)

这个似乎足以解决您的直接问题:

$serverObj = gwmi Win32_operatingsystem -computer $i.server

应该是

$serverObj = gwmi Win32_operatingsystem -computer $i

$i没有超出[string]的属性。默认情况下,PowerShell将允许您尝试获取不存在的属性,并且在这种情况下将返回null。但Get-WMIObject不能用于参数-Computer。错误非常具体。

有一种方法可以尝试捕获这些问题但是使用Set-StrictMode -Version 2.0例如。来自TechNet

  

2.0

     

- 禁止引用未初始化的变量(包括字符串中未初始化的变量)。

     

- 禁止引用对象的不存在的属性。

     

- 禁止使用调用方法语法的函数调用。

     

- 禁止没有名称的变量($ {})。

您指的是您收到的主要错误 ...这是否意味着您有更多?

您的while状况似乎有缺陷。您应该尝试评估布尔表达式,但您只是返回数据。即使ping失败,也应该返回数据,这可能会使循环逻辑无效。考虑使用-Quiet开关test-connection。您还在检查所有 $servers而不只是$i的ping。

while (!(Test-Connection $i -count 1 -Quiet))

也许...