11 Replies Latest reply on Jan 9, 2018 8:04 AM by robertR

    PowerShell-Scripts

    robertR Apprentice

      Hallo

      leider ist die Doku über die Powershell nicht so ganz toll. Aber zum Glück gibt es die NWC dort wird das recht gut erklärt von Frank Scholer.

      Ich habe jetzt aber trotzdem ein Problem das wenn ich ein Script teste. Erst über ein direkte Ausführung des Script ob es geht und so tut wie es soll. Wenn
      ich das dann in DSM Einbau geht es nicht mehr . Jetzt hab ich das auf verschieden weise getestet und versteh das ganze nicht. Wenn ich das über executeex rufe und angemeldet bin geht es.

      Ist niemand angemeldet geht's nicht mehr. Meine Frage kann man PowerShell Scripte immer nur imUserContext starten?

      Oder mach ich da was falsch.

      Wie macht ihr das?

        • 1. Re: PowerShell-Scripts
          _Mel_ Master

          der callscript befehl von DSM benutzt einen eigenen powershellhost.

          das problem könnte sein, daß der keine Unterstützung für Ausgaben hat, d.h. Write-Host u.Ä. funktioniert meines Wissens nicht

          dafür hat dsm den write-nireport befehl

          das ist natürlich ein thema, bei dem sich ein featurerequest "Write-Host sollte in callscript die ausgabe ins installerlogfile schreiben" durchaus lohnen könnte - wenn daran interesse besteht

          (wenn keine feature requests kommen, dann liegt bei sachen, die schon immer so sind, eben auch die vermutung nahe, daß daran keiner interesse hat)

           

          umgekehrt ist callscript natürlich auch deshalb interessant, weil man darüber dsm variablen lesen und setzen kann - und das funktioniert bei der direkten ausführung natürlich nicht, so daß man in dem fall ohnehin in dsm testen muß

          • 2. Re: PowerShell-Scripts
            robertR Apprentice

            Danke Mel,

            ich habe das Problem das mein Script was an der Console funktioniert, dann aus DSM nicht mehr geht.

            Ich habe jetzt mal ein wenig damit gespielt und fest gestellt das mir das Script abfliegt bei einem Get Befehl, kann das sein das $target = Get-BrokerMachine -MachineName Domäne\$xenserver -AdminAddress $ctrl

            das Snapin lade ich zuvor.

            Muss man das Snapin anders laden wen man den Befehl CallScript verwendet? Das Snapin ist Add-PSSnapin Citrix*.

            • 3. Re: PowerShell-Scripts
              _Mel_ Master

              ich kenn das citrix snapin nicht, aber einige snapins funktionieren nur in einer 64bit powershell (und vermutlich gibt's auch welche, die nur in 32 bit funktionieren)

              wenn du den callscript befehl nicht auf 64bit geflaggt hast könnte das vielleicht das problem sein, da auf der kommandozeile normalerweise die 64bit powershell gestartet wird und in dsm 32 bit der default ist

              • 4. Re: PowerShell-Scripts
                sbr2 Expert

                Hallo,

                 

                ich mache viel mit Citrix XenApp und PowerShell über DSM.

                Das funktioniert über CallScript einwandfrei. Wie Mel schon geschrieben hat auf jeden fall den Haken für x64 setzen.

                 

                Viele Grüße,

                Stefan

                • 5. Re: PowerShell-Scripts
                  robertR Apprentice

                  Hallo ich kapier das nicht und bring das nicht hin.

                  Mein Powershellscript sieht so aus ganz einfach eigentlich.

                   

                  $xenserver = Get-NIVar "xenserver"
                  $mode = Get-NIVar "mode"
                  $ctrl = "Controller:80"

                  Write-NiReport "$xenserver $mode"
                  Write-NiReport "Wartungsmodus für:  $xenserver  soll: $mode "
                  Write-NiReport "Brokerserver:  $ctrl "
                  Add-PSSnapin Citrix*

                  $target = Get-BrokerMachine -MachineName KLINIKUM-GAP\$xenserver -AdminAddress $ctrl

                  if ($mode -eq "True")
                       {

                          Set-BrokerMachineMaintenanceMode -InputObject $target -MaintenanceMode $true
                       }
                  else
                       {
                          Set-BrokerMachineMaintenanceMode -InputObject $target -MaintenanceMode $false
                       }
                   
                  Write-NiReport "Wartungsmodus für:  $xenserver  ist  $Mode"

                   

                  Jetzt bricht das ganze ab hier ab -->  $target = Get-BrokerMachine deshalb meine ich das das PSSnapin nicht richtig geladen wurde muss man das anders angeben?

                  Was mache ich falsch?

                   

                  Das log sieht so aus.

                   

                  15:55:36.592 2        -> CallScript('c:\batch\mmodeNI.ps1','')/x64/TS

                  15:55:36.592 2         ExecHostClient32.dll: starting Execution Host Server Process "C:\Program Files (x86)\NetInst\ExecHostServer64.exe".

                  15:55:36.592 2         ExecHostClient32.dll: RPC Server (pipe name 'ExecHost_2084') was started.

                  15:55:36.701 2         ExecHostClient32.dll: RPC client (pipe name 'ExecHost_2084') was started and the server is listening.

                  15:55:36.701 0         xniTools: Got dwDepotId from xniFPS for 'c:\batch\mmodeNI.ps1': 0

                  15:55:36.701 2         ExecHostClient32.dll: Calling script c:\batch\mmodeNI.ps1.

                  15:55:37.809 0         xniTools: NiGetVar-> Trying to access NetInstall-Variable [xenserver]

                  15:55:37.809 0         xniTools: NiGetVar-> NetInstall-Variable [xenserver] successfully read.

                  15:55:37.824 0         xniTools: NiGetVar-> Trying to access NetInstall-Variable [mode]

                  15:55:37.824 0         xniTools: NiGetVar-> NetInstall-Variable [mode] successfully read.

                  15:55:37.840 2         xniTools: NiReport-> "Xenappserver true"

                  15:55:37.840 2         xniTools: NiReport-> "Wartungsmodus für:  Xenappserver  soll: true "

                  15:55:37.855 2         xniTools: NiReport-> "Brokerserver:  Controller:80 "

                  15:55:38.292 2         xniTools: RuntimeError: src:C:\batch\mmodeNI.ps1 / line: 10 / position: 28

                  15:55:38.292 2         xniTools: RuntimeError: Caught Exception of type System.Management.Automation.CmdletInvocationException

                  Insufficient administrative privilege

                  15:55:38.292 2         xniTools: RuntimeError: Code: $target = Get-BrokerMachine -MachineName Domäne\$xenserver -AdminAddress $ctrl

                  15:55:38.292 2         ExecHostClient32.dll: Script c:\batch\mmodeNI.ps1 has been called.

                  15:55:38.292 E         Error (Module:xniTools, Severity:0x0b): Execution of NIL_CallScript with script c:\batch\mmodeNI.ps1 failed

                  Beim Ausführen der Funktion ist ein Fehler aufgetreten. (0x0000065b)

                  15:55:38.292 2         Messagebox suppressed  (No output allowed), output is written to the log files

                  15:55:38.292 2         MsgBox: [Execution of NIL_CallScript with script c:\batch\mmodeNI.ps1 failed

                  Beim Ausführen der Funktion ist ein Fehler aufgetreten. (0x0000065b)

                  Installation wird beendet.]

                  • 6. Re: PowerShell-Scripts
                    sbr2 Expert

                    Hallo Robert,

                     

                    du musst folgendes verändern.

                     

                    1. Die Variable für den Controller in einfach Anführungszeichen. Sonst wird der mit dem Doppelpunkt Probleme haben, bzw. hast du es schon ohne den Port probiert?

                       $ctrl = 'Controller:80'

                    2. Den Namen der Broker Maschine ebenfalls in einfach Anführungszeichen. Sonst hat er ein Thema mit dem Backslash.

                    $target = Get-BrokerMachine -MachineName 'KLINIKUM-GAP\$xenserver' -AdminAddress $ctrl

                     

                     

                    Viele Grüße,

                    Stefan

                    • 7. Re: PowerShell-Scripts
                      robertR Apprentice

                      Hallo Danke Stefan,

                      das hatte aber nichts mit den Hochkommas zu tun. Der DSMRUNTIME User braucht auf dem Citrix Controller rechte zum ändern des Status. Jetzt geht das .

                      Man das war ein Akt.

                      • 8. Re: PowerShell-Scripts
                        sbr2 Expert

                        Ja, das ist klar. Da du geschrieben hast das es manuell funktioniert dachte ich du hast es schon mit dem Service Account ausprobiert.

                         

                        Jedoch trotzdem auf die Hochkommas achten. Sonst kommst du bei anderen Scripten in Schwierigkeiten.

                         

                        Viele Grüße,

                        Stefan

                        • 9. Re: PowerShell-Scripts
                          SupportEmployee

                          Wir haben auf Anregung eines geschätzten Partners in Bezug zu diesem Thread eine Dokumentationsanforderung im Produkt Management platziert:

                          • FR: Enhance DSM online documentation with integrated Powershell specifications (RM254138)

                          Ich hoffe das ist im Sinne der Community.

                          • 10. Re: PowerShell-Scripts
                            Thomas.Ebrecht@verdi.de Rookie

                            Hallo Robert, wie ich sehe konntet ihr das Problem durch Rechteveränderung lösen. Kannst du mir mitteilen, was du genau geändert hast. Ich habe hier ein ähnliches Problem, möchte die BIOS-Einstellungen per PowerShell anpassen und habe auch nicht die nötigen Rechte bei Ausführen des Scripts. Manuell geht es, wenn ich die DSM-konsole als Administrator starte.

                             

                            Danke

                            Thomas

                            • 11. Re: PowerShell-Scripts
                              robertR Apprentice

                              Hallo Thomas,

                              Bei uns war das Problem das der DSMRuntime User nicht das recht hatte auf dem XenController Änderungen durchzuführen. Wir haben den User berechtigt und da durch hat das Funktioniert.

                              Ich denke bei dir ist das was anderes. Sieht mehr so aus als währe der Befehl nicht als Service gesetzt. Schau da noch mal nach.

                               

                              Gruß

                              Robert