When I comment the Invoke-Command line the script completes successfully when not return Timeout PE018
My code:
##USB MONITOR ##param( ##[string]$DEVICE ##) $DEVICE = "USB_HUB_01" ## CREDENTIALS $username = "test.local\testprtg" $password = Get-Content "C:\PRTG\Custom Sensors\EXEXML\Key.txt" | ConvertTo-SecureString $credential = New-Object System.Management.Automation.PsCredential($username,$password) $server = 'server.test.local' $RESULT = "0" $ScriptBlockContent = { $MORPHOUSBREMOTE = gwmi Win32_USBControllerDevice |%{[wmi]($_.Dependent)} return $MORPHOUSBREMOTE.DeviceID } ##$session = New-PSSession -computerName $server -credential $credential $MORPHOUSBLIST = Invoke-command -credential $credential -scriptblock $ScriptBlockContent -computerName $server ##Remove-PsSession $session.id foreach ($i in $MORPHOUSBLIST){ if ($DEVICE -eq $i){ $RESULT = "1" break; }else{ $RESULT = "0" } } "<prtg>" "<result>" "<channel>MSG</channel>" "<value>$RESULT</value>" "</result>" "</prtg>"
WMI and PowerShell - this might be an issue. You might possibly face a x32 and x64 issue here.
If so, you can work around it - look at the following link - it talks about a Parser-Script to bypass this issue. https://www.it-admins.com/monitoring-shadow-copies-with-prtg/
In the end it is a similar situation where WMI is in use.
Btw. - you have code you wouldn't need in your loop - the ELSE case is obsolete cause you set the variable way above to 0 and break it the second you change it anyways.. This should be sufficient:
Regards
Florian Rossmark
www.it-admins.com
Aug, 2018 - Permalink