12 Replies Latest reply on Oct 14, 2016 6:18 AM by SitzRieSe

    WMISimpleQuery

    BaSe Apprentice
      Hallo,

      ich habe ein Script das die SAPGUI 6.20 deinstalliert und die SAPGUI 7.2 installeren soll.

      Das ganze Script sieht so aus:

      If RegKeyExists('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SAPFrontend')
      ExecuteEx('%windir%\SAPwksta\setup\sapsetup.exe /uninstall /silent /all','returnuninst620','10')/?/TS
      : return
      WMISimpleQuery('\\.\root\cimv2','CIM_Process','Caption=sapsetup.exe','WMI_')
        Caption
      EndProc
      If %WMI_Caption%='sapsetup.exe'
        Sleep('30')
        goto return
      ExecuteEx('.\Extern$\WIN32\setup\NwSAPsetup.exe /Silent /Package="SAP GUI 7.20 (Complilation 2) "','returncode','15')/?/TS
      If not %returncode%='0'
      ExitProcEx(Failed,'Installation fehlgeschlagen !')
      Copy('.\Extern$\saplogon.ini','%windir%\saplogon.ini')/U/B/TS
      : $BeginUninstallScript
      ExecuteEx('%ProgramFilesDir%\SAP\SAPsetup\setup\NwSapSetup.exe /uninstall /silent /product="ECL710+BW350+KW710+GUI710ISHMED+GUI710TWEAK+JNet+SAPGUI710" /TitleComponent:"SAPGUI710" /IgnoreMissingProducts','uninstall','15')/?/TS



      Jetzt ist es aber so das das Script in der Schleife hängen bleibt obwohl
      im Taskmanager der Process sapsetup.exe nicht mehr zusehen ist.

      09:24:58.237 2    ->  WMISimpleQuery('\\.\root\cimv2','CIM_Process','Caption=sapsetup.exe','WMI_') ...
      09:24:58.253 1     xniTools: namespace \\.\root\cimv2 connected successfully
      09:24:58.269 1     xniTools: getting instance list of CIM_Process...
      09:24:58.300 1     xniTools: 42 instance(s) found. searching for 'Caption=sapsetup.exe' ...

      09:24:58.472 1    Evaluating condition "_WMI_Caption_='sapsetup.exe'"
      09:24:58.472 0     Comparing 'sapsetup.exe' with 'sapsetup.exe'
      09:24:58.472 2    Condition TRUE  -> entering IF part

      09:24:58.487 2    ->   Sleep('30')

      09:25:28.691 2    ->   goto return



      Woran kann das liegen?
        • 1. Re: WMISimpleQuery
          FrankScholer Master
          Hallo BaSe,

          du musst - nach dem Return-Label die Variable erst (mit dem Set-Befehl) initialisieren, z.B. auf nen Leerstring setzen. Wenn's den Prozess nicht mehr gibt, dann behält die Variable nach der WMI-Abfrage ihren letzten Wert und dann hängst du natürlich in der Endlos-Schleife...

          HTH, Grüße Frank
          • 2. Re: WMISimpleQuery
            Smettiw Apprentice
            du kannst auch folgenden Code verwenden. Habe den hier jetzt aus ner 5.80er Variante kopiert. Funktioniert aber prima unter v6.x oder DSM7, da es die Befehle dafür noch gibt. Ist auch ein Beispiel dafür was Frank gemeint hat. "Xname="" ".

            !Beende evtl. laufende Prozesse
            : While1
            Set('_ProcessName','program.exe')
            Set('Xname','')
            WMISimpleQuery('\\.\root\cimv2','Win32_Process','Name=%_ProcessName%','X')
            Name
            EndProc
            If %XName%='%_ProcessName%'
            --> entweder KillProcess('test',kpByFileName+kpKillAll)/TS
            --> und/oder Sleep('30')
            goto While1

            PS... beim Speichern wird hier "Name" als "N ame" angezeigt. keine Ahnung warum aber beim einfügen nochmal kurz prüfen ob er den Code übernimmt. ;-)

            Gruß

            Smetti
            • 3. Re: WMISimpleQuery
              SitzRieSe Expert
              Bevor ich jetzt dafür ein neues Thema eröffne... Vielleicht kann mir Jemand einmal mit der Syntax von WMISimpleQuery helfen. Ich tuh mich damit grade etwas schwer. Ich versuche:

              WMISimpleQuery('\\.\root\cimv2\security\microsofttpm','win32_tpm','IsEnabled_InitialValue=True','WMI_')
              TPM
              EndProc/TS



              Damit möchte ich den Status des TPM Chips abfragen. Ich bekomme dann aber im Log ein WMI_TPM set to [Error] zurück.

              Wenn ich per Eingabeaufforderung am selben System den Befehl benutze:

              wmic
              amespace:\\root\cimv2\security\microsofttpm path win32_tpm get IsEnabled_InitialValue



              dann bekomme ich den Wert "true" zurück, also die Abfrage funktioniert.

              Jetzt habe ich den Namespace im WMISimpleQuery auch schon auf \\root\cimv2 geändert, dann bekomme ich aber die Meldung "Failed to connect to namespace". Kann mir Jemand bei der Abfrage einmal helfen?

              danke!

              Gruß

              Alex
              • 4. Re: WMISimpleQuery
                derniwi Master
                Hallo Alex,

                welche Windowes-Version nutzt Du? Unter Win7 gibt es die Klasse Win32_TPM nicht...

                Gruß
                Nils
                • 5. Re: WMISimpleQuery
                  SitzRieSe Expert
                  Hi Nils,

                  Windows 10

                  wie schon beschrieben, feuer ich den Befehl manuell ab, funktioniert er
                  • 6. Re: WMISimpleQuery
                    SitzRieSe Expert
                    Hier mal der Logauszug:

                    10:38:48.344 2        -> WMISimpleQuery('\\root\cimv2\security\microsofttpm','win32_tpm','IsEnabled_InitialValue=True','WMI_') ... /TS
                    10:38:48.345 2         nilsPipe: NPI: Initializing Runtime - Manager ..
                    10:38:48.387 1         nilsPipe: Setting active Server project to 'db:master\Cfg - Enable BitLocker'
                    10:38:48.389 2         nilsPipe: Executing through IPC : WMISimpleQuery
                    10:38:48.389 1         nilsPipe: Script needs addon xniTools.dll for execution - notifying NPI
                    10:38:48.390 2         nilsPipe: NPI: Loading AddOn xniTools.dll
                    10:38:48.537 2         nilsPipe: NPI: -> WMISimpleQuery('\\root\cimv2\security\microsofttpm','win32_tpm','IsEnabled_InitialValue=True','WMI_') ...
                    10:38:48.538 1         nilsPipe: Service var bridge: Setting var WMI.ERROR to 0
                    10:38:48.538 1         nilsPipe: Service var bridge: Setting var WMI.ERRORTEXT to
                    10:38:53.096 2         nilsPipe: NPI: ER: Creating event manager
                    10:38:53.096 2         nilsPipe: NPI: module is not allowed to send ExR data
                    10:38:53.096 E         Warning (Module:nilsPipe, Severity:0x03): NPI: WMI: Couldn't connect to namespace \\root\cimv2\security\microsofttpm.
                    10:38:53.096 1         nilsPipe: Service var bridge: Setting var _LAST_ERROR_TEXT to NPI: WMI: Couldn't connect to namespace \\root\cimv2\security\microsofttpm.
                    10:38:53.096 1         nilsPipe: Service var bridge: Setting var _ERROR_SEVERITY to 3
                    10:38:53.096 2         SWMSRT: //------------| Starting Checking if policies should run for the trigger 'On error'. |------------\\
                    10:38:53.096 2         SWMSRT: \\------------| Finished Checking if policies should run for the trigger 'On error'. |------------//
                    10:38:53.112 1         nilsPipe: Service var bridge: Setting var _LAST_ERROR_TEXT to WMI: Couldn't connect to namespace \\root\cimv2\security\microsofttpm.
                    10:38:53.112 1         nilsPipe: Service var bridge: Setting var _ERROR_SEVERITY to 3
                    10:38:53.112 1         nilsPipe: Service var bridge: Setting var WMI.ERROR to 1
                    10:38:53.112 1         nilsPipe: Service var bridge: Setting var WMI.ERRORTEXT to WMI: Couldn't connect to namespace \\root\cimv2\security\microsofttpm.

                    10:38:53.112 1        Evaluating condition "not _WMI_TPM_='True'"
                    10:38:53.112 E         Warning (Module:Main, Severity:0x03): Can't resolve variable WMI_TPM
                    10:38:53.112 2         SWMSRT: //------------| Starting Checking if policies should run for the trigger 'On error'. |------------\\
                    10:38:53.112 2         SWMSRT: \\------------| Finished Checking if policies should run for the trigger 'On error'. |------------//
                    10:38:53.112 2        Condition TRUE    -> entering IF part



                    Also ich hab jetzt schon \.\\ und \\ am Anfang probiert beides funktioniert nicht. Kann es vielleicht sein das DSM nicht auf diesen Bereich/Namespace zugreifen kann?

                    Wenn ich den WMISimpleQuery Befehl über die GUI konfigurieren will, sagt er mir ebenfalls "Verbindung zum Namespace fehlgeschlagen". Obwohl ich die DSMC elevated gestartet habe! Auch an dem System funktioniert die Abfrage über wmic.

                    Jemand ne Idee?

                    Gruß

                    Alex
                    • 7. Re: WMISimpleQuery
                      SitzRieSe Expert
                      Ich hab jetzt denk ich die Syntax richtig... bekomme aber:

                      11:34:59.592 2        ---->Starting installation of "Cfg - Enable BitLocker"

                      11:34:59.595 2        -> WMISimpleQuery('\\.\Root\CIMV2\Security\MicrosoftTpm','Win32_Tpm','IsEnabled_InitialValue=true','WMI_') ... /TS
                      11:34:59.595 1         nilsPipe: Setting active Server project to 'db:master\Cfg - Enable BitLocker'
                      11:34:59.596 2         nilsPipe: Executing through IPC : WMISimpleQuery
                      11:34:59.596 1         nilsPipe: Script needs addon xniTools.dll for execution - notifying NPI
                      11:34:59.597 2         nilsPipe: NPI: Loading AddOn xniTools.dll
                      11:34:59.733 2         nilsPipe: NPI: -> WMISimpleQuery('\\.\Root\CIMV2\Security\MicrosoftTpm','Win32_Tpm','IsEnabled_InitialValue=true','WMI_') ...
                      11:34:59.734 1         nilsPipe: Service var bridge: Setting var WMI.ERROR to 0
                      11:34:59.735 1         nilsPipe: Service var bridge: Setting var WMI.ERRORTEXT to
                      11:34:59.879 1         nilsPipe: Service var bridge: Setting var WMI_TPM to [Error]

                      11:34:59.880 1        Evaluating condition "not _WMI_TPM_='True'"
                      11:34:59.880 2        Condition TRUE    -> entering IF part

                      • 8. Re: WMISimpleQuery
                        FrankScholer Master
                        Hi Alex,

                        die Variable, die dir der WMISimpleQuery-Befehl füllt setzt sich zusammen aus dem Prefix und der abgefragten Eigenschaft. Bei dir heißt die Variable, deren Wert du per If-Statement prüfen willst, also "WMI_IsEnabled_InitialValue"...

                        HTH, Grüße Frank
                        • 9. Re: WMISimpleQuery
                          SitzRieSe Expert

                          Hi Alex,

                          die Variable, die dir der WMISimpleQuery-Befehl füllt setzt sich zusammen aus dem Prefix und der abgefragten Eigenschaft. Bei dir heißt die Variable, deren Wert du per If-Statement prüfen willst, also "WMI_IsEnabled_InitialValue"...

                          HTH, Grüße Frank



                          Okay Oo... Auch bei WMISimpleQuery? Dort gibt es doch unter dem Variablenpräfix noch das Feld Eigenschaften. Dort hab ich TPM reingeschrieben... Müsste er das Ergebnis dann nicht aus dem Variablenpräfix (WMI_) und der Eigenschaft (TPM nach WMI_TPM auflösen?

                          Weil das sagt mir ja auch das Logfile:

                          11:34:59.879 1 nilsPipe: Service var bridge: Setting var WMI_TPM to [Error



                          Oder Muss die Eigenschaft dann identisch mit der Abfrage sein?
                          • 10. Re: WMISimpleQuery
                            FrankScholer Master
                            Hallo nochmal,

                            also, ich hab das gerade nochmal probiert. Wenn du WMISimpleQuery nimmst, musst du auf jeden Fall auf einen Eigenschaft der Klasse filtern / abfragen. Da es in dieser Klasse m.E. keine Eigenschaft gibt, deren Wert du sicher kennst, ist der Befehl nicht optimal.

                            Ich würde in dem Fall meinen, dass es besser ist, den Befehl WMIGetIndexData zu nehmen, da man glaube ich halbwegs guten Gewissens davon ausgehen kann, dass es nur eine Instanz der Klasse WIN32_TPM gibt, das heißt du holst dir einfach den Wert der Eigenschaft aus der ersten Instanz ;-)

                            Hier mal mein Script, das bei mir funktioniert:

                            WMIGetIndexData('\\.\root\cimv2\security\microsofttpm','WIN32_TPM','0','WMI_')
                            IsEnabled_InitialValue
                            EndProc
                            If %WMI_IsEnabled_InitialValue%='true'
                            MsgBox
                              Das TPM ist aktiviert.
                            EndProc
                            Else
                            MsgBox
                              Das TPM ist nicht aktiviert.
                            EndProc


                            HTH, Grüße und schönes Wochenende
                            Frank
                            • 11. Re: WMISimpleQuery
                              derniwi Master
                              Hallo,

                              ich habe das hier nochmal unter Windows 7 ausprobiert.
                              Zuerst scheiterte ich daran, dass ich die Abfrage mit einem anderen Programm als normaler Anwender gestartet habe - keine Berechtigung. Also mit erweiterten Rechten gestartet...

                              Dann konnte ich die Klasse über den entsprechenden Pfad wählen. Da bei mir TPM nicht aktiv ist, ist aber keine Instanz vorhanden. Somit kann ich in diesem Fall nichts abfragen.

                              D.h., um mit der DSMC den Wert auswählen zu können, muss diese mit administrativen Rechten gestartet werden.

                              Mein Test-Skript sieht so aus:
                              Set('Count','0')
                              WMIGetInstanceCount('\\.\root\cimv2\Security\MicrosoftTpm','Win32_Tpm','Count')/TS
                              If %Count%='-1'
                              MsgBox
                                Keine TPM-Instanz vorhanden
                              EndProc
                              Else
                              If not %Count%='0'
                                WMIGetIndexData('\\.\root\cimv2\Security\MicrosoftTpm','Win32_Tpm','0','WMI_')
                                 IsEnabled_InitialValue
                                EndProc/TS
                                MsgBox
                                 TPM: IsEnabled_InitialValue= %WMI_IsEnabled_InitialValue%
                                EndProc
                              Else
                                MsgBox
                                 Keine TPM-Instanz vorhanden
                                EndProc


                              Wichtig ist auch hier, dass die WMI-Abfragen über den Service laufen - jedenfalls unter Win7.

                              Edit:
                              Count=0 dürfte eigentlich nicht vorkommen, aber das könnte man auch per ODER-Verknüpfung in die erste If-Abfrage packen.

                              Gruß
                              Nils
                              • 12. Re: WMISimpleQuery
                                SitzRieSe Expert
                                Danke!

                                Auf WMIGetInstanceCount bin ich ehrlich gesagt nicht gekommen... Das funktioniert einwandfrei