9 Replies Latest reply on Feb 3, 2016 8:52 AM by Klaus Salger

    läuft die OS Installation noch?

    Nice2010 Expert
      Hallo,

      ich suche eine DSM Client Objekt Eigenschaft die ich abfragen kann, ob meine OS Installation noch läuft. Kennt da jemand etwas? Am besten per Powershell.

      Liebe Grüße

      Norbert
        • 1. Re: läuft die OS Installation noch?
          Frank.Scholer Master
          Hallo Norbert,

          willst du das am Client prüfen oder "in der Konsole" (also in der DB)...? Im ersten Fall den OSInstallInProgress Reg-Value prüfen, im zweiten Fall kannst du auf den Compliance-Status des OS Installation Sets checken.

          Wenn du natürlich auch noch Pakete nach dem eigentlichen OS installierst (was sicherlich gängig ist) und die für dich noch zu der OS Installation gehören, auf die du prüfen willst, dann musst du vielleicht checken, ob es noch irgendwelche Policy-Instanzen gibt, die den Status "Compliance pending" haben (und wenn du's ganz sauber machen willst, dann zur Sicherheit für alle PIs die noch offen sind auch prüfen, ob der Startzeitpunkt bereits erreicht ist und ob es keine clientseitigen Installationsvoraussetzungen die Installation verhindern)...

          HTH, Gruß Frank
          • 2. Re: läuft die OS Installation noch?
            Nice2010 Expert
            Hallo, Frank,

            danke für deine Antwort. Ich möchte gegen die Console / DB abfragen. An das OS-Set habe ich auch schon gedacht, aber wenn es ein neues OS gibt, dann muss das Script angepasst werden. Das wollte ich verhindern.
            Neben dem OS möchte ich noch weitere Pakete abfragen, aber das kann dann ja analog zum OS Set gemacht werden.

            Liebe Grüße

            Norbert
            • 3. Re: läuft die OS Installation noch?
              Klaus Salger Expert
              Hallo Norbert,

              wie Frank schon sagte gibt's da ein paar Wenns und Abers zu beachten wenn man's perfekt haben möchte.
              Wir verzichten jetzt mal auf die Perfektion...

              1. Man kann das Compliance-Flag des Computers abfragen.
              OK, das ist jetzt nicht, was Du wolltest, ich erwähne es trotzdem mal weil's einfacher und flexibler ist also auf einzelne Zuweisungen zu gehen.
              Das kann man per Powershell (PSX) z.B. so umsetzen:
              (Get-EmdbComputer -Path "emdb:\rootDSE\" -Recurse -SingleItemExpected).LastCalculatedCompliance


              2. Wenn man nur die OS-Installation betrachten will muss man die Policyinstanzen etwas näher anschauen.
              Man muss aber immerhin nicht explizit angeben welchen OSSet genau man haben möchte, sondern sucht sich einfach den bzw. die zugewiesenen.

              Als Einzeiler sieht das dann z.B. so aus:
              Get-EmdbComputer -Path "emdb:\rootDSE\" -Recurse -SingleItemExpected | Get-EmdbPolicyInstance | Where-Object {$_.GetAssignedObject().Type -eq 'OS Installation Set'} | ForEach-Object {$_.AssignedObjectName + ": " + $_.ComplianceState}

              Also Policyinstanzen der Maschine auslesen, auf Policyinstanzen vom Typ "OS Installation Set" filtern und Name und Compliance-Status ausgeben.

              Wenn man den Status anderer Policyinstanzen abfragen möchte, kann man den Filterteil entsprechend anpassen und z.B. den Paketnamen als Kriterium verwenden.

              Ciao
                Klaus
              • 4. Re: läuft die OS Installation noch?
                Nice2010 Expert

                Hallo Norbert,

                wie Frank schon sagte gibt's da ein paar Wenns und Abers zu beachten wenn man's perfekt haben möchte.
                Wir verzichten jetzt mal auf die Perfektion...

                1. Man kann das Compliance-Flag des Computers abfragen.
                OK, das ist jetzt nicht, was Du wolltest, ich erwähne es trotzdem mal weil's einfacher und flexibler ist also auf einzelne Zuweisungen zu gehen.
                Das kann man per Powershell (PSX) z.B. so umsetzen:
                (Get-EmdbComputer -Path "emdb:\rootDSE\" -Recurse -SingleItemExpected).LastCalculatedCompliance


                2. Wenn man nur die OS-Installation betrachten will muss man die Policyinstanzen etwas näher anschauen.
                Man muss aber immerhin nicht explizit angeben welchen OSSet genau man haben möchte, sondern sucht sich einfach den bzw. die zugewiesenen.

                Als Einzeiler sieht das dann z.B. so aus:
                Get-EmdbComputer -Path "emdb:\rootDSE\" -Recurse -SingleItemExpected | Get-EmdbPolicyInstance | Where-Object {$_.GetAssignedObject().Type -eq 'OS Installation Set'} | ForEach-Object {$_.AssignedObjectName + ": " + $_.ComplianceState}

                Also Policyinstanzen der Maschine auslesen, auf Policyinstanzen vom Typ "OS Installation Set" filtern und Name und Compliance-Status ausgeben.

                Wenn man den Status anderer Policyinstanzen abfragen möchte, kann man den Filterteil entsprechend anpassen und z.B. den Paketnamen als Kriterium verwenden.

                Ciao
                  Klaus




                Hallo Klaus, vielen Dank, dass ist eine super Idee.

                Hast du eine Idee wieso deine Abfrage pro Client ca. 76 Sekunden braucht? Das komische ist, ich bekomme das Ergebnis teilweise nach ca.  5 Sekunden angezeigt. Es dauert dann aber noch ca. eine Minute bis die nächste Abfrage startet oder wen es nur eine Abfrage ist, bis diese beendet wird.

                Liebe Grüße

                Norbert
                • 5. Re: läuft die OS Installation noch?
                  Klaus Salger Expert
                  Naja, jeder Computer hat ja wahrscheinlich recht viele Policyinstanzen.
                  Wenn die OS-Policyinstanz recht weit am Anfang ist, dann kann es danach schon eine Weile dauern bis alle Policyinstanzen sinnlos durchgedaddelt sind.
                  Was hier auf jeden Fall eine Erleichterung bringen sollte ist, wenn man aus dem Einzeiler ein Script macht und den Filter-Foreach-Loop nach der ersten OS Inst Set-Policyinstanz abbricht.
                  Also z.B. so:
                  Foreach ($PI in $PIs) {
                  $AssignedObject = $PI.GetAssignedObject()
                  If ( ($AssignedObject.Type) -eq 'OS Installation Set') {
                    $Result = $AssignedObject.Name + " : " + $PI.ComplianceState
                    break
                  }
                  }


                  Ciao
                    Klaus
                  • 6. Re: läuft die OS Installation noch?
                    Nice2010 Expert

                    Naja, jeder Computer hat ja wahrscheinlich recht viele Policyinstanzen.
                    Wenn die OS-Policyinstanz recht weit am Anfang ist, dann kann es danach schon eine Weile dauern bis alle Policyinstanzen sinnlos durchgedaddelt sind.
                    Was hier auf jeden Fall eine Erleichterung bringen sollte ist, wenn man aus dem Einzeiler ein Script macht und den Filter-Foreach-Loop nach der ersten OS Inst Set-Policyinstanz abbricht.
                    Also z.B. so:

                    Foreach ($PI in $PIs) {
                    $AssignedObject = $PI.GetAssignedObject()
                    If ( ($AssignedObject.Type) -eq 'OS Installation Set') {
                      $Result = $AssignedObject.Name + " : " + $PI.ComplianceState
                      break
                    }
                    }


                    Hallo Klaus,

                    mit $PIs sind die Computer gemeint die Angefragt werden?

                    Ansonsten bekomme ich immer diese Meldung:
                    Fehler beim Aufrufen der Methode, da [System.String] keine Methode mit dem Namen "GetAssignedObject" enthält.
                    In DSM Policystatus abfragen.ps1:77 Zeichen:14
                    +                 $AssignedObject = $PI.GetAssignedObject()
                    +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        + CategoryInfo          : InvalidOperation: ( [], RuntimeException
                        + FullyQualifiedErrorId : MethodNotFound

                    Hast du eine Idee?
                    • 7. Re: läuft die OS Installation noch?
                      Klaus Salger Expert
                      Ja klar, Du musst die Policyinstanzen natürlich vorher schon haben - das ist nur ein Schnippsel, den man halt so oder ähnlich in ein Script einbauen kann.
                      Im einfachsten Fall z.B. so:
                      $PIs = Get-EmdbComputer -Path "emdb:\rootDSE\" -Recurse -SingleItemExpected | Get-EmdbPolicyInstance
                      Foreach ($PI in $PIs) {
                      $AssignedObject = $PI.GetAssignedObject()
                      If ( ($AssignedObject.Type) -eq 'OS Installation Set') {
                        $AssignedObject.Name + " : " + $PI.ComplianceState
                        break
                      }
                      }


                      Ciao
                        Klaus
                      • 8. Re: läuft die OS Installation noch?
                        Nice2010 Expert

                        Ja klar, Du musst die Policyinstanzen natürlich vorher schon haben - das ist nur ein Schnippsel, den man halt so oder ähnlich in ein Script einbauen kann.
                        Im einfachsten Fall z.B. so:

                        $PIs = Get-EmdbComputer -Path "emdb:\rootDSE\" -Recurse -SingleItemExpected | Get-EmdbPolicyInstance
                        Foreach ($PI in $PIs) {
                        $AssignedObject = $PI.GetAssignedObject()
                        If ( ($AssignedObject.Type) -eq 'OS Installation Set') {
                          $AssignedObject.Name + " : " + $PI.ComplianceState
                          break
                        }
                        }


                        Ciao
                          Klaus


                        Perfekt, funktioniert prima. Vielen Dank

                        Nun möchte ich noch von einzelne Pakete abfragen. Aber irgendwie habe die falschen Ansätze. Die einzelnen Policy IDs bekomme ich zwar angezeigt, die sind ja bei jedem Client unterschiedlich. Im Prinzip möchte ich den Installationsstatus eines Paketes abfragen. So kann ich abschätzen, wie lange die Installation noch läuft.

                        Kannst du mir da auch noch helfen?

                        Liebe Grüße
                        Norbert
                        • 9. Re: läuft die OS Installation noch?
                          Klaus Salger Expert
                          Hallo Norbert,

                          OK, in $PIs hast Du ja alle Policyinstanzen des Computers.
                          Die kannst Du also genauso wie im Beispiel vorher in einer Schleife durchgehen.
                          In jeder Policyinstanz gibt es u.a. die Properties AssignedObjectName und AssignedObjectId.
                          Die kannst Du also z.B. mit dem gesuchten Paketennamen oder besser noch mit der Paket-ID vergleichen.

                          Wenn Du nur einmalig die Compliance eines Pakets auf einem Computer abfragst, dann kann man direkt mit dem Paketnamen vergleichen.
                          Wenn Du häufiger mehrere Pakete auf mehreren Computern abfragst lohnt es sich vorher die Paket IDs zu den Namen zu suchen und in der Schleife mit der AssignedObjectId zu vergleichen - das bringt sowas wie Faktor 10 an Geschwindigkeit und belastet den BLS weniger.
                          Dabei ist allerdings zu beachten, dass unterschiedliche Revisionen unterschiedliche IDs haben - wenn Du alle haben willst musst Du also alle vergleichen.

                          Das kann dann ohne Perfektion, Fehlerbehandlung, Logging, etc. etc. aber immerhin lauffähig z.B. so aussehen:

                          Param (
                          $Computername,
                          $Packagename
                          )

                          $PackageIDs = (Get-EmdbSoftwarePackage -Path "emdb:\rootDSE\$Packagename" -Recurse -AllRevisions).ID
                          $PIs = Get-EmdbComputer -Path "emdb:\rootDSE\$Computername" -Recurse -SingleItemExpected | Get-EmdbPolicyInstance

                          Foreach ($PI in $PIs) {
                          If ($PackageIDs -contains $PI.AssignedObjectId) {
                            write-host "$Packagename@$($Computername): $($PI.ComplianceState) ($($PI.ComplianceDate))"
                            break
                          }
                          }


                          Ciao
                            Klaus