我从博客中获取此脚本并对其进行修改以适应我的环境。但是,我在迭代foreach循环并获取服务状态或远程计算机($ unregisteredVM)时遇到问题。
似乎Get-Service试图查询执行脚本的计算机而不是远程计算机。
此外,我尝试运行脚本部分来抓取计算机的状态,并将该变量设置为-Computername参数,但它似乎不接受它。
$ icaservicestate = Get-Service PorticaService -ComputerName $ unregisteredVM |选择状态
我缺少什么?以下是整个代码。
##Load Citrix Modules
asnp Citrix.*
#Variables for email
[string[]]$recipients = "xxxxx@xxxxxx.com"
$fromEmail = "xxxxx@xxxx.com"
$server = "itopia-us.mail.protection.outlook.com"
$date= Get-Date
##Check for VMs on and unregistered
$unregisteredVMs = Get-BrokerDesktop -RegistrationState Unregistered | Select MachineName
[string]$emailVMs = Get-BrokerDesktop -RegistrationState Unregistered | Select MachineName | ft -wrap -autosize | Out-String
IF (!$unregisteredVMs) {
##Send all clear email
[string]$emailBody = "There were no powered on desktops in an unregistered state."
send-mailmessage -from $fromEmail -to $recipients -subject " XenDesktop Daily Check - $date" -body $emailBody -priority High -smtpServer $server
}
Else {
##If powered-on and unregistered, perform a forceful restart
foreach ($unregisteredVM in $unregisteredVMs)
{
$icaservicestate = Get-Service PorticaService -ComputerName $unregisteredVM | select status
IF ($icaservicestate = Stopped) {
Set-Service -Name PorticaService -Status Running
}
Else {
sc \\$unregisteredVM start PorticaService
}
#Write-Host "Hello, I am unregistered: $unregisteredVM"
}
#Send an email report of VMs to be restarted due to being in an unregistered state
[string]$emailBody = "The following desktops were forcefully restarted due to not registering with the DDCs in a timely manner. `n $emailVMs"
send-mailmessage -from $fromEmail -to $recipients -subject " XenDesktop Daily Check - $date" -body $emailBody -priority High -smtpServer $server
}
答案 0 :(得分:1)
我不确定这是否是你的整个问题,但我不认为这是你想要的:
IF ($icaservicestate = Stopped)
assigns
执行名为Stopped
的命令到变量$ icaservicestate的结果。我怀疑你有一个名为Stopped
的命令。对于等式比较,请使用-eq
并引用Stopped
:
IF ($icaservicestate -eq 'Stopped') { ... }
答案 1 :(得分:1)
有两个可能的原因导致您无法获得所需的结果。
首先:在Powershell中,单个等号是赋值运算符
您的if
语句第24行正在将$icaservicestate
的值重新分配给错误
$icaservicestate = Get-Service PorticaService -ComputerName $unregisteredVM | select status
IF ($icaservicestate = Stopped) {
Set-Service -Name PorticaService -Status Running
}
使用
IF ($icaservice -eq 'stopped') {
第二次:第23行Cmdlet Get-Service
可能由于第11行传递给您的对象而失败
$unregisteredVMs = Get-BrokerDesktop -RegistrationState Unregistered | Select MachineName
在上面的行中,您生成了一个[array]
个对象,每个对象都有一个名为MachineName的属性。
在第23行,您尝试将对象传递给ComputerName
Cmdlet的Get-Service
参数。要解决此问题,您可以在Get-Service
cmdlet中使用$ unregisteredVM.MachineName
$ icaservicestate = Get-Service PorticaService -ComputerName $ unregisteredVM.MachineName |选择状态
您可以通过在提示符处键入以下内容,详细了解属性值在管道中传递的方式:
help about_piplines
并寻找'ByValue'和'ByPropertyName'
<强>更新强>
if ($icaservicestate -eq 'Stopped') {
Get-Service -Name PorticaService -ComputerName $unregisteredVM.MachineName | Set-Service -Status Running
}
以前,行Set-Service -Name PorticaService -Status Running
将尝试在本地计算机上启动该服务。
首先,我们在远程计算机上获取对PorticaService的引用,然后将该对象传递给Set-Service Cmdlet并将状态设置为运行。
答案 2 :(得分:0)
我认为您的脚本不起作用,因为您从“get-brokerdesktop”返回的计算机名称采用domainname \ vdiname格式。对于“get-service -computername”,您只需输入主机名。 要“隔离”我要做的主机名: $ unregisteredVM = $ unregisteredVM.machinename -replace(“domainname \,”“) $ unregisteredVM = $ unregsiteredVM.trim()
现在$ unregisteredVM应该只包含主机名。