WMI Filtering σε Group Policy Objects ή αλλιώς “αυτός ο άγνωστος”


Ξεκινάω λοιπόν το πρώτο μου blog post και σκέφτηκα να σας απασχολήσω με το “άγνωστο” WMI filtering που μπορεί να εφαρμοστεί σε Group Policy objects, θα μου πείτε “που θα χρειαστώ κάτι τέτοιο;”, η απάντηση είναι: στις περιπτώσεις που χρειάζεται να εφαρμόσετε η όχι κάποια πολιτική, πχ σε ένα OU του Active Directory που έχει μεικτά αντικείμενα όπως Computers που είναι Servers αλλά και Clients (από άποψη λειτουργικού συστήματος).

Το WMI filtering χρησιμοποιεί ερωτήματα (queries) γραμμένα στη γλώσσα WQL που υποστηρίζει το WMI -ουσιαστικά SQL like είναι η σύνταξη τους-, και επιστρέφει τα αποτελέσματα στα group policy objects για περαιτέρω χρήση. Το δύσκολο κομμάτι είναι η συγγραφή τέτοιων ερωτημάτων μιας που το documentation για το WMI είναι σχετικά “τρομακτικό” σε μέγεθος και όπως γνωρίζω πολύ καλά από την πλευρά του System Administrator, ο χρόνος για “πολύ” διάβασμα είναι λίγος.

“Να σημειωθεί ότι WMI Filtering υποστηρίζεται από τα Windows XP λειτουργικά και άνω, δηλαδή Windows 2003, Vista, 2008.”

Ας δούμε λοιπόν τι χρειάζεται για να κάνουμε τη δουλειά μας:

1) Group Policy Management Console, η οποία μπορεί να εγκατασταθεί είτε σε Server είτε σε Client O/S:

2) WMI Code Creator http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en εύχρηστο εργαλείο για την εκμάθηση και δημιουργία κώδικα με WMI queries χωρίς να πονοκεφαλιάζετε , απλά προσθέτετε ότι επιπλέον θέλετε, μετά από λίγη εξάσκηση και χρήση να είστε σίγουροι ότι θα παίζετε στα δάκτυλα τα τμήματα κώδικα που φτιάχνει, δημιουργεί κώδικα σε VBScript, C# και VB .Net!

3) Ένας Domain Controller με OUs και Objects μέσα τους, δεν μας απασχολεί η έκδοση του Server (Win 2003 και άνω όμως).

4) Τουλάχιστον ένα GPO (Group Policy Object) για να δοκιμάσουμε το query μας.

Σενάριο:

Ας πούμε ότι θέλουμε να κλείνουμε το Messenger Service σε όλους τους υπολογιστές που τρέχουν Windows 2003 Server λειτουργικό και υποθέτουμε ότι όλοι οι υπολογιστές είναι σε ένα OU που ονομάζεται “Company Computers” στο domain tiptoys.local, θεωρούμε ότι οι τύποι λειτουργικών είναι Windows XP και Windows 2003.

Είναι πολύ εύκολο να φτιάξουμε ένα GPO που να θέτει σε “disabled” το Messenger Service, αλλά πως εφαρμόζεται σε συγκεκριμένους υπολογιστές;

Η μια λύση είναι να μεταφερθούν οι υπολογιστές που μας ενδιαφέρουν σε άλλο OU στο AD και μετά να γίνει εκεί link του GPO, αυτό όμως δεν είναι πάντα εφικτό και εύχρηστό, οπότε τη λύση τη δίνει το WMI Filtering, μέσω του οποίου θα πούμε στο GPO να εφαρμόζεται μόνο σε λειτουργικά συστήματα Windows 2003 Server.

Οπότε μας απομένει η λύση της δημιουργίας ενός GPO με τις ρυθμίσεις που θέλουμε και το απαραίτητο WMI φίλτρο.


Εκτέλεση:

Group Policy Management Console (δε θα ειπισέλθω σε λεπτομέρειες χρήσης της κονσόλας)

Δημιουργούμε ένα νέο GPO με τις ακόλουθες ρυθμίσεις:

Name: “CC – Disable Messenger Service (Win2k3 Servers Only)”, CC σημαίνει “Computer Configuration” και αφορά στο τμήμα που θα  εφαρμοστούν οι αλλαγές, ως γνωστόν οι Group Policy ρυθμίσεις χωρίζονται σε δυο κατηγορίες “Computer Configuration” και “User Configuration”.

Settings τα παρακάτω: CC-Disable Messenger Service GPO

Όπως βλέπετε στο “System Services” το “Messenger (Startup Mode)” είναι “Disabled” και δεν έχουν οριστεί επιπλέον ρυθμίσεις όπως “Permissions” κ’ “Auditing”.


Δημιουργία του WMI Filter

Ας ξεκινήσουμε με τα βασικά, όλα τα queries για  WMI Filtering ξεκινούν έτσι:

Namespace: πχ root\CIMV2

Select * FROM WMI_Class WHERE PROPERTY [OPERATOR] VALUE

Εξηγώ όσα είναι με Bold λοιπόν:

WMI_CLASS: Δυναμική η στατική, περιέχει μεθόδους (METHODS) και ιδιότητες (PROPERTIES), προς το παρόν δε θα μας απασχολήσουν οι μέθοδοι. Οι κλάσσεις είναι σχετικά ξεκάθαρες απο τις ονομασίες τους, δυστυχώς πρέπει να ψάχνετε κάθε κλάση για να δείτε τι περιέχει, ειδάλως ανατρέχετε στο documentation της Microsoft http://msdn.microsoft.com/en-us/library/aa394554(VS.85).aspx.

PROPERTY: Ιδιότητες που περιέχονται μέσα σε μια κλάση WMI και επιστρέφουν τιμές Boolean, Alphanumeric, Text, Date, Time.

[OPERATOR]: Οι γνωστοί τελεστές, πχ το = , υπάρχουν και άλλοι όπως ο “like” -χωρίς τα “” για τον οποίο μπορείτε να διαβάσετε περισσότερα εδώ http://msdn.microsoft.com/en-us/library/aa392263%28VS.85%29.aspx

VALUE: Η τιμή που θέλουμε να επιστραφεί στη GP Engine, βάσει αυτής φιλτράρονται τα αποτελέσματα, φυσικά μπορούμε να κάνουμε αρκετούς συσχετισμούς μέχρι να φτάσουμε στο επιθυμητό αποτέλεσμα, να θυμάστε όμως ότι όταν γράφετε το query προσπαθήστε να το διατηρήσετε σχετικά απλό, έτσι θα γλυτώσετε πολλές ώρες άδικου bug hunting.

Αν σκεφτούμε τι θέλουμε να κάνουμε για το σενάριο μας, βρίσκουμε ως λύση τον έλεγχο του τύπου των Windows, αυτό μπορεί να γίνει με πολλούς τρόπους όπως θα δείτε παρακάτω, αναφέρω τη λύση και την αντίστοιχη Property μαζί με τον τύπο και τις πιθανές τιμές αν υπάρχουν:

α) Ονομασία του λειτουργικού: πχ Windows XP Professional | Property: Caption, type string

β) Τύπος του λειτουργικού: πχ Server | Property: ProductType, type Numeric, τιμές 1=Work Station, 2=Domain Controller,  3=Server

γ) Τμήμα απο το λεκτικό που περιέχεται στο Boot.ini και αναφέρει το λειτουργικό αλλά και το partition στο οποίο έχει εγκατασταθεί, δε βολεύει ιδιαίτερα, ειδικά αν κάποιος κάνει αλλαγές στο boot.ini και αλλάξει το όνομα. | Property: Name, type String, πχ Name: Microsoft Windows Server 2003 R2 Enterprise Edition|C:\WINDOWS|\Device\Harddisk0\Partition1

δ) Να χρησιμοποιηθεί ο αριθμός κατασκεύης (Build Number) ή η Έκδοση μιας που είναι μοναδικοί αριθμοί και ξεχωρίζουν κάθε έκδοση | Property #1: BuildNumber, type: Numeric και Property #2: Version, type Numeric.

Αυτό λοιπόν που θα εφαρμόσουμε είναι ένα ερώτημα στο Caption του λειτουργικού και θα φροντίσουμε να το γενικεύσουμε όσον αφορά τους 2003 Servers.

Ανοίγουμε λοιπόν το WMI Code Creator και επιλέγουμε:

Namespace: root\CIMV2

Classes: Win32_OperatingSystem

Properties: Caption (μόνο)

Πατήστε το πλήκτρο “Search for Property Values” και ακριβώς απο κάτω εμφανίζεται το αποτέλεσμα μέσα σε αποσιωπητικά, προσέξτε που στους Servers 2003 το λεκτικό ξεκινά πάντα με “Microsoft(R) Windows(R) Server 2003,” μετά το κόμμα ακολουθεί ο τύπος (Standard κτλ). Το γεγονός αυτό δυσκολεύει λίγο τα πράγματα γιατί χρειάζεται να βρούμε κάποιο τρόπο να περιγράψουμε στο query ότι θέλουμε τα λεκτικά Server 2003 να εντοπίζει μέσα στο λέκτικό του Caption.

Η λύση είναι η χρήση του LIKE operator μιας που μας επιτρέπει να ψάχνουμε για πρότυπα μέσα στα λεκτικά και η χρήση του operator “%” που ψάχνει γι’ αυτά οπουδήποτε στο String, ανεξάρτητα απο τη θέση που βρίσκεται.

Προσέξτε στο δεξί τμήμα του WMI Code Creator τον κώδικα που έχει δημιουργηθεί, για να εντοπίσετε πως θα φτιάξετε το query εντοπίστε το σημείο που ξεκινά με:

SELECT * FROM

Το τελικό μας query διαμορφώνεται ως εξής:

SELECT * FROM Win32_OperatingSystem WHERE Caption LIKE “%Server 2003%”

Δημιουργούμε ένα νέο WMI Filter μέσω της GPMC και το ονομάζουμε “Apply to Windows 2003 Servers Only“, πατάμε ADD και επιλέγουμε ως namespace “root\CIMv2” και Query: SELECT * FROM Win32_OperatingSystem WHERE Caption LIKE “%Server 2003%”.

Αποθηκεύουμε το φίλτρο κάνουμε κλικ στο GPO που θέλουμε να εφαρμοστεί, μπορεί να εφαρμόζεται σε διαφορετικά GPOs αλλά δεν μπορούν να εφαρμοστούν διαφορετικά φίλτρα σε ένα GPO, μόνο ένα φίλτρο / GPO. Επιλεγουμε απο τη λίστα το φίλτρο που φτιάξαμε και στην ερώτηση απαντάμε καταφατικά (βλ φωτό):

WMI_Filtering_2

Σ’ αυτό το σημείο έχουμε ολοκληρώσει το φίλτρο και το μόνο που απομένει είναι η σύνδεση του GPO με το OU που μας ενδιαφέρει, κάτι το οποίο σας αφήνω ως άσκηση.

Ακολουθεί ένα μικρό Quiz:

1) Πως θα εφαρμόσουμε πολλαπλά φίλτρα σε ένα GPO;

2) Μπορούμε στο WMI Code Creator να επιλέξουμε περισσότερες απο μια ιδιότητες έτσι ώστε να δημιουργηθεί το κατάλληλο query;

3) Τι θα γίνει αν χρησιμοποιήσουμε μόνο την ιδιότητα ProductType=3 και το OU έχει και Windows 2000 Servers μέσα;

4) Πως επαληθεύουμε ότι ένα WMI filter λειτουργεί;

Απαντήστε με comment και θα στείλω σε comment τις απαντήσεις σε 10 ημέρες.

Σημείωση: Αυτό το άρθρο έχει αναδημοσιευτεί από το παλιό μου Blog στο Autoexec.gr

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s