Hallo,
Anhand des von Ihnen zur verfügung gestellten Scripts sehe ich nicht, warum das Script nicht in der 32bit-Powershell laufen soll. Evtl. wurde auf der 32bit-Powershell vergessen, 'set-Execution Policy' auszuführen (powershell-script-works-from-powershell-prompt-but-not-from-prtg)?
Ansonsten habe ich vor kurzem ein Script geschrieben welches demnächst per Default mit PRTG ausgeliefert werden wird und den Start von 64bit-Powershell-scripten ermöglicht.
Als Übergang können Sie das Script auch manuell erstellen:
Hierfür bitte in dem Verzeichnis, welches das Sensor-script enthält ein weiteres .ps1-script anlegen mit folgendem Inhalt (Bei auslieferung mit PRTG wird das script den Namen 'Demo Powershell Script - Run Custom Powershell Sensor in 64bit Powershell.ps1' erhalten):
# this script is based on information from support.microsoft.com at http://msdn.microsoft.com/en-us/library/aa384187(v=vs.85).aspx
# "Windows2003 64-bit"-users need to install a hotfix from Microsoft, pleaes refer to http://support.microsoft.com/kb/942589 for futher information!
# Use the parameter-section of the sensor to provide the script to be executed as well as additional arguments
# examples:
# 'Demo Powershell Script - Return architecture used for Powershell.ps1'
# 'Demo Powershell Script - Return architecture used for Powershell.ps1' Demovalue
# 'Demo Powershell Script - Return architecture used for Powershell.ps1' -demo1 "This is a Demo Argument" -demo2 This is a bad example
$Invocation = $Script:MyInvocation
[string] $path = split-path $Invocation.MyCommand.path -parent
[string] $scriptname = $Invocation.UnboundArguments[0].split("\")[-1]
[string] $scriptarguments = ""
foreach ($arg in $Invocation.UnboundArguments[1..($Invocation.UnboundArguments.count)]) {
if ($arg.tostring().StartsWith("-")) {
$scriptarguments += "$arg "
} else {
$scriptarguments += """$arg"" "
}
}
[string] $windir = (get-childitem -path env:windir).value
[string] $psdir = "sysnative\windowspowershell"
[boolean] $direxists = (Test-Path "$($windir)\$($psdir)")
[string] $64bitPS = Join-Path -path (Join-Path -path $windir -childpath $psdir) -childpath "v1.0\powershell.exe"
[boolean] $is32bit = [System.IntPtr]::Size -eq 4
if ( $is32bit -and $direxists ) {
cmd.exe /C "$64bitPS -file ""$($path)\$($scriptname)"" $scriptarguments"
exit $lastexitcode
} elseif ( $is32bit -and -not $direxists ) {
"0:ERROR there is no 64-bit version of PowerShell available"
exit 2
} else {
"0:ERROR you are running the script from a 64-bit PowerShell"
exit 2
}
Danach können Sie einen neuen 'Custom Exe'-Sensor anlegen, im DropDown-Menü dieses neue Script auswählen und bei den Sensor-Parametern den Namen des eigentlichen Scriptes sowie die nötigen Argumente übergeben.
Zum Überprüfen können sie folgendes 'Test'-script, welches die verwendete Architektur (32 oder 64 bit), sowie die ausgewerteten Argumente test1 und test2 zurückgibt, verwenden:
z. B. das script unter "<PRTG-System-Ordner>\Custom Sensors\EXE\Demo Powershell Script - Return architecture used for Powershell.ps1" anlegen, folgenden Inhalt hinein kopieren
Param([string]$demo1,[string]$demo2)
# resize the window to be able to return larger strings than the default 80 characters without linebreak:
$pshost = get-host
$pswindow = $pshost.ui.rawui
$newsize = $pswindow.buffersize
$newsize.width = 150
$pswindow.buffersize = $newsize
$newsize = $pswindow.windowsize
# in PowerShell ISE size is not settable
if ( $newsize -ne $null ){
$newsize.width = 150
$pswindow.windowsize = $newsize
}
$params = ""
if ( $demo1.length -gt 0 ) { $params += ", Named Parameter demo1 '$($demo1)'" }
if ( $demo2.length -gt 0 ) { $params += ", Named Parameter demo2 '$($demo2)'" }
if ( $args.length -gt 0 ) { $params += ", unnamed Parameters '$($args)'" }
if ([System.IntPtr]::Size -eq 4) {
"32:32-bit$($params)"
} else {
"64:64-bit$($params)"
}
und als Parameter des neuen 'Custom Exe' (nicht Advanced!) Sensors (der auf das vorhergehende Wrapper-Script verweisen muss) die im eigentlichen Script hinterlegten Beispielparameter einsetzen.
Mit freundlichen Grüßen
Add comment