none
WMI Query zum Ausführen von SCCM Queries RRS feed

  • Frage

  • Hi,

    in SCCM habe ich diverse Queries erstellt, deren Resultat mittels ASP webbasiert zur Verfügung gestellt werden sollen.
    Fragt sich jetzt natürlich jeder, warum nicht Reports verwenden - ich bin kein sonderlich großer Freund davon...

    Wie auch immer, folgende Idee funktioniert schon fast wie ich es mir vorstelle.

    Zunächst lese ich die SQL Syntax einer bestimmten SCCM Query:

    Const strUser = "..."
    Const Passwd = "..."
    Const SMSServer = "SCCM_Server"
    Const SMSSiteCode = "xyz"
    Const Domain = "domain"
    
    set lLocator = CreateObject("WbemScripting.SWbemLocator") 
    set gService = lLocator.ConnectServer("bb1s0010","Root\SMS\Site_" & SMSSiteCode,strUser,Passwd,"MS_409","NTLMDomain:" & Domain)
        
    query = "select * from SMS_Query where name = 'iTunes'"
    Set objWMIService = gService.ExecQuery(query)
    For Each qry In objWMIService
      Query = qry.Expression
    Next


    Das Resultat, welches in der Variablen "Query" gespeichert ist:

    select SMS_G_System_SYSTEM.Name, SMS_R_System.LastLogonUserDomain, SMS_R_System.LastLogonUserName, SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName, SMS_G_System_ADD_REMOVE_PROGRAMS.Version from SMS_R_System inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId inner join SMS_G_System_SYSTEM on SMS_G_System_SYSTEM.ResourceID = SMS_R_System.ResourceId where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName like "%iTunes%"

    Diese Query nun wiederum ausgeführt:

    Set objWMIService = gService.ExecQuery(Query)
    For Each expr In objWMIService
      s1 = expr.SMS_G_System_SYSTEM.Name
      s2 = expr.SMS_R_System.LastLogonUserName
      response.write s1 & " - " & s2 & "<br>"
    Next

    Alles prima bis hier hin.

    Jedoch können die Spaltenüberschriften der Queries variieren.
    Somit bin ich gezwungen genau zu wissen, wie diese benannt sind (hier fett dargestellt):

     expr.SMS_G_System_SYSTEM.Name


    Gibt es keine Möglichkeit, diese Spalten erkennen zu lassen ?

    Zum Einen ist dies so nicht möglich:

    expr.Fields("SMS_G_System_SYSTEM.Name")

    Ebenso die Feldnamen ermitteln ist so nicht möglich:

    Set objWMIService = gService.ExecQuery(query)
    for each objWMIService.fields
    next


    Hat jemand eine Idee ?


    Donnerstag, 30. Mai 2013 14:41

Alle Antworten

  • Fragt sich jetzt natürlich jeder, warum nicht Reports verwenden - ich bin kein sonderlich großer Freund davon...

    Gegenfrage: wieso so einen Aufwand treiben, wenn doch alles per Reports viel einfacher ist (im Speziellen, wenn man die Reporting Services Reports verwendet)? Deine Lösung führt offensichtlich zum Ziel, aber der direkte Weg ist das nicht ;-)
    Ansonsten hier die Query:

    Set objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\sms\site_tm1:SMS_G_System_ADD_REMOVE_PROGRAMS")
    For Each objClassProperty In objClass.Properties_
        WScript.Echo objClassProperty.Name
    Next


    Torsten Meringer | http://www.mssccmfaq.de

    Donnerstag, 30. Mai 2013 16:42
    Beantworter
  • Berechtigte Gegenfrage :-) Nur scripte ich sowas gerne selber, da wir an allen möglichen Stellen noch weitere Quellen "anzapfen".
    Sei es ein verlinkter Computername, der Info's aus dem Active Directory oder anderen SQL Datenbanken Infos zieht, bis hin zum "Managen" von Collectionmemberships. Natürlich könnte ich den Query Code 1:1 in die Scripts direkt übernehmen, aber wenn ich sie auf dem SCCM Server erstelle
    und sich die ASP Seite diesen direkt holt ud ausführt wäre dies um einiges eleganter.

    Mit dem von Dir gepostete Query Code habe ich den Schmerz, daß ich nicht weiß,wie man sich gegen den Server authentifizieren kann.
    Das ganze läuft in einer (classic) ASP Umgebung und es soll ein spezieller Domänen-Account zum Connecten verwendet werden.


    Daher stolpere ich bei all meinen Suchen in Web immer wieder auf diese Methode zum Connecten, nur dort scheint "objClass.Properties_" eben nicht zu gehen:

    Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
    Set objSWbemServices = objSWbemLocator.ConnectServer _ (strComputer, "root\cimv2", "fabrikam\administrator", "password")

    Hast Du noch eine weiterführende Idee ?

    Donnerstag, 30. Mai 2013 20:13