Pomimo mnogości funkcji dostępnych w konsoli System Center Configuration Managera 2007, często zdarza się, że czegoś nam brakuje. Nieważne, czy jest to odświeżenie polis komputerów, czy też po postu sprawdzenie, czy wszystkie komputery w danej kolekcji są włączone (zwykły ping kolekcji). Z pomocą przychodzi wtedy SDK do SCCM 2007, które można pobrać stąd. Zawiera ono między innymi dokumentację opisującą sposób tworzenia rozszerzeń (rozdział Configuration Manager Console Extension). Na szczęście wielu specjalistów tworzy takie oprogramowanie. Dwa najbardziej rozbudowane, to SCCM Console Extensions (pobierz) oraz SCCM Right Click Tools (pobierz).
Ogólnie rozszerzenia do konsolki SCCM można podzielić na pięć grup:
- Akcje - czynności wykonywane na obiektach konsoli dostępne z menu pod prawym przyciskiem myszy, lub z panelu akcji
- Formularze - okna dialogowe, lub karty właściwości (dodawanie funkcjonalności do istniejących, lub tworzenie nowych)
- Węzły nawigacyjne - dodawanie węzłów nawigacyjnych
- Widoki - możliwość tworzenia widoków wyświetlanych w panelu wyników, nowych stron domowych, przypisując je do istniejących, lub nowo stworzonych węzłów nawigacyjnych
- Kreatorzy (Wizards) - integracja kreatorów stworzonych w dowolnie wybranym Frameworku
Jednocześnie zostało wprowadzone klika ograniczeń
- Nie można modyfikować istniejących kreatorów SCCMa, oraz przy tworzeniu nowych nie można korzystać z istniejących fragmentów czarodziejów.
- Nie można modyfikować podstawowych funkcjonalności konsoli, (których definicje są zawarte standardowo w katalogu %ProgramFiles%\Microsoft Configuration Manager\AdminUI\XmlStorage\ConsoleRoot)
- Rozszerzenia SMS 2003 wykorzystujące interfejsy IMMF nie są obsługiwanie (ponieważ SCCM przyjmuje tylko kod zarządzany)
- Wtyczki oparte na wpisach w rejestrze nie będą działać (na SMS 2003 działały)
- Rozszerzenia MMC napisane w SDK do Microsoft Management Console nie są kompatybilne
Architektura rozszerzeń konsoli SCCM
Cała konsola ConfigMgra jest zbudowana w architekturze warstwowej
- SMS Provider - znany z SMS 2003 provider WMI/WBEM, wykorzystywany w skryptach VB
- Zarządzany Provider SMS w SDK - zbiór klas i interfejsów.NET Framework opakowujących SMS Provider.
- Framework Interfejsu użytkownika - zbudowany w oparciu o SMS Provider SDK dający funkcjonalność wyświetlania okien i powiadomień
- Pliki XML Konsoli - umieszczone standardowo w katalogu %ProgramFiles%\Microsoft Configuration Manager\AdminUI\XmlStorage\ definicje wyglądu i zachowania przystawki ConfigMgra. W zależności od podfolderu mogą one pełnić różne funkcje:
|
Folder
|
Opis
|
|
ConsoleRoot
|
AdminConsole.Xml - Zawiera wszystkie definicje interfejsu SCCMa. Plik ma znaczenie krytyczne. Definiuje GUIDy poszczególnych węzłów konsoli (o GUIDach będzie niżej). Pod żadnym pozorem nie zmieniać!
ManagementClassDescriptions.Xml - Definiuje klasy SMS Providera. Pod żadnym pozorem nie zmieniać!
ResourceExplorer.Xml - Definicje zasobów. Pod żadnym pozorem nie zmieniać!
|
|
Extensions
|
Katalog z właściwymi rozszerzeniami:
- Actions - rozszerzenia akcji
- Nodes - rozszerzenia węzłów
- Forms - rozszerzenia formularzy
|
|
Other
|
Różne pliki pomocnicze
|
|
Validation
|
Reguły walidacji dla formularzy SCCMa
|
Wdrażanie rozszerzeń
Sposób wdrażania rozszerzenia do konsoli jest uzależniony od jego typu. W przypadku ogólnym ogranicza się on do skopiowania plików definicji w odpowiednie miejsce i ewentualne zrestartowanie przystawki. Poniższa tabelka obrazuje standardowe ścieżki, w których należy umieścić wtyczki:
|
Typ
|
Ścieżka
|
|
Akcja
|
%ProgramFiles%\Microsoft Configuration Manager\AdminUI\XmlStorage\Extensions\Actions
|
|
Formularz
|
%ProgramFiles%\Microsoft Configuration Manager\AdminUI\bin dla bibliotek
%ProgramFiles%\Microsoft Configuration Manager\AdminUI\XmlStorage\Extensions\Forms dla plików XML
|
|
Widok
|
%ProgramFiles%\Microsoft Configuration Manager\AdminUI\XmlStorage\bin
|
|
Węzeł
|
%ProgramFiles%Microsoft Configuration Manager\AdminUI\XmlStorage\Extensions\Nodes
|
W przypadkach szczególnych wygląda to następująco:
Akcje
Instalacja - skopiowanie definicji do katalogu %ProgramFiles%\Microsoft Configuration Manager\AdminUI\XmlStorage\Extensions\Actions\GUID gdzie GUID jest identyfikatorem węzła, do którego odnosi się czynność. Można do odnaleźć na dwa sposoby:
- Odnaleźć jego definicję w pliku %ProgramFiles%\Microsoft Configuration Manager\AdminUI\XmlStorage\ConsoleRoot\AdminConsole.xml. Dla przykładu linijka
<RootNodeDescription NamespaceGuid="3ad39ff0-efd6-11d0-bdcf-00a0c909fdd7" ObjectClass="SMS_Collection" Id="SmsCollectionNode" DisplayName="Collections" Description="CollectionsDescription" HelpTopic="0e3a11cc-13b3-41d3-9adc-f731c36b785b" SqmDataPoint="1102">
mówi, że cały węzeł Collections ma GUID 3ad39ff0-efd6-11d0-bdcf-00a0c909fdd7
- Użyć rozszerzenia SCCM 2007 GUID Assistant, które można pobrać stąd
Usuwanie - sprowadza się do usunięcia pliku definicji (xml), lub jeśli jest jedynym, to można spokojnie kasować cały folder GUID.
Formularze
Instalacja - pliki bibliotek należy umieścić w %ProgramFiles%\ Microsoft Configuration Manager\AdminUI\bin lub w folderze instalacyjnym aplikacji. W tym drugim przypadku, przy tworzeniu definicji XML, wewnątrz znacznika <Assembly> atrybut Name musi zawierać pełną ścieżkę do dll-ki. Samą definicję wrzucamy do %ProgramFiles%\Microsoft Configuration Manager\AdminUI\XmlStorage\Extensions\Forms z tym tylko ograniczeniem, że nazwa pliku musi być unikatowa. Jeżeli nasze rozszerzenie modyfikuje istniejące okno właściwości, to trzeba się upewnić, czy dana pozycja jest już modyfikowana (istnieją odnoszące się do niej pliki XML w katalogu Extensions\Forms). Jeśli takowe występują, to definicję karty należy dodać do znalezionego arkusza. W przeciwnym wypadku trzeba skopiować oryginalną definicję z %ProgramFiles%\Microsoft Configuration Manager \AdminUI\XmlStorage\Forms do Extensions\Forms
Ważna wskazówka - przy tworzeniu rozszerzeń warto uzupełnić atrybut VendorId w elemencie PropertySheet, ponieważ pomaga to zidentyfikować niestandardowe rozszerzenia.
Usuwanie - tutaj znów mamy kilka przypadków:
- Gdy tworzymy nową stronę właściwości, to można spokojnie usunąć xml
- Gdy modyfikowaliśmy istniejący arkusz:
- Jeśli nasz VendorId jest jedynym oprócz Microsoft Corporation, to usuwamy pliki
- Jeśli są dodatkowe VendorId, to modyfikujemy definicje usuwając tylko nasze modyfikacje stron
Widoki
Instalacja - tu znów kopiujemy biblioteki do %ProgramFiles%\ Microsoft Configuration Manager\AdminUI\bin. Po raz kolejny także jeśli są one w niestandardowej lokalizacji, to trzeba wpisać do nich pełną ścieżkę w definicji
Tu z kolei trzeba pamiętać, że jeżeli dany widok zmienia węzeł, to ten węzeł, też trzeba skopiować - tym razem do katalogu %ProgramFiles%\Microsoft Configuration Manager\AdminUI\XmlStorage\Extensions\Nodes\GUID gdzie GUID jest identyfikatorem węzła
Usuwanie - odbywa się poprzez skasowanie odpowiednich bibliotek i usunięciu referencji do nich w definicjach węzłów
Węzły
Instalacja -Tu jest bardzo prosto - wrzucamy definicje do %ProgramFiles%\Microsoft Configuration Manager\AdminUI\XmlStorage\Extensions\Nodes\GUID gdzie GUID jest identyfikatorem węzła
Usuwanie - wykonuje się poprzez skasowanie pliku xml definicją
Przykład rozszerzenia
Jako, że powyższy tekst może się wydawać zawiły, to przejdziemy teraz do praktyki - stworzymy proste rozszerzenie konsoli, które wyłączy wszystkie komputery w kolekcji.
Pierwszym krokiem jaki musimy podjąć, to znaleźć GUID węzła w konsoli odpowiadającego za kolekcje. Żeby ułatwić sobie sprawę skorzystamy z wyżej wspomnianego GUI Assistanta.
Zgodnie z instrukcją z readme.txt w katalogu c:\temp\ tworzymy dwa pliki: test.vbs, który wygląda tak:
Const ForAppending = 8
strGUID = Wscript.Arguments(0)
strMSG = inputbox("Enter Description for this GUID")
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile("c:\temp\GUIDInfo.txt", ForAppending, True)
ts.Write strGUID & vbTAB & strMSG & vbCRLF
ts.close
Oraz pusty GUIDInfo.txt. Następnie zawartość katalogu GUID wypakowujemy do %ProgramFiles%\Microsoft Configuration Manager\AdminUI\XmlStorage\Extensions\Actions\. Po tej operacji przy kliknięciu prawym przyciskiem myszy na dowolnej kolekcji pojawi się następujące menu kontekstowe:

Mówi nam ono, że mamy dwóch kandydatów na GUID kolekcji: a8859bde-df8c-4df7-93a8-4d55c5294cfd oraz fa922e1a-6add-477f-b70e-9a164f3b11a2. Żeby rozwiać wątpliwości odwołamy się do pliku AdminConsole.Xml.
Pierwszy z nich znajdujemy w linijce <ScopePaneItemDescription NamespaceGuid="a8859bde-df8c-4df7-93a8-4d55c5294cfd"> dzięki czemu wiemy, że jest to definicja hierarchii węzłów (więcej informacji można znaleźć tutaj ) Drugi GUID pojawia się tuż poniżej: <QueryDescription NamespaceGuid="fa922e1a-6add-477f-b70e-9a164f3b11a2" Type="WQL" DisplayName="##SUB:Name##" Description="##SUB:Name##" SupportsCountQuery="true" HelpTopic="1bc8da58-4e16-4f38-ab9c-73b0c414cd9b"> W kontekście interfejsu kolekcje są zwykłymi zapytaniami, więc wiemy, że trafiliśmy dobrze, fa922e1a-6add-477f-b70e-9a164f3b11a2 to szukany przez nas identyfikator. Wobec tego w folderze %ProgramFiles%\Microsoft Configuration Manager\AdminUI\XmlStorage\Extensions\Actions\fa922e1a-6add-477f-b70e-9a164f3b11a2 tworzymy xml (nazwa jest dowolna - ważne jest, żeby miał odpowiednie rozszerzenie), który będzie wyglądać tak:
<ActionDescription Class="Executable" DisplayName="Shutdown Computers in collection" MnemonicDisplayName="Note" Description = "Collection shutdown">
<Executable>
<FilePath>c:\shutdown\shutodwn.vbs</FilePath>
<Parameters>##SUB:collectionID## ##SUB:__Server## ##SUB:__Namespace##</Parameters>
</Executable>
</ActionDescription>
Oczywiście należy pamiętać, że c:\shutdown\shutdown.vbs powinien istnieć. Z kolei ##SUB:collectionID## ##SUB:__Server## ##SUB:__Namespace## przekazują do skryptu kolejno: ID kolekcji na której kliknęliśmy, nazwę serwera SCCM oraz przestrzeń nazw WMI na serwerze. Zawartość shutdown.vbs:
' Argument 0 - ##SUB:collectionID##
' Argument 1 - ##SUB:_Server##
' Argument 2 - ##SUB:_Namespace##
WScript.Echo("Computers shut down for collection with ID: " & WScript.Arguments(0))
'Shell execute object
Dim wshShell
set wshShell=CreateObject("WScript.Shell")
'connect to WMI namespace on SCCM server
winmgmt1 = "winmgmts:{impersonationLevel=impersonate}!//" & WScript.Arguments(1) & "\" & WScript.Arguments(2)
Set SystemSet = GetObject( winmgmt1 )
'get all computers in collection
strQuery = "SELECT * FROM SMS_CM_RES_COLL_" & WScript.Arguments(0)
'enumerate collection
Set objEnumerator = SystemSet.ExecQuery(strQuery)
For each instance in objEnumerator
'get machine name
sMachine = instance.name
'shutdown it using psshutdown.exe
wshShell.run "c:\shutdown\psshutdown.exe -c \\" & sMachine & " -n 15 -s -f -t 60",0,false
Next
Cały zaprezentowany tutaj kod można pobrać stąd.
Podsumowanie
Powyższy tekst podsumowuje pokrótce czym są rozszerzenia konsoli System Center Configuration Managera, jaka jest architektura konsoli, oraz w jaki sposób wdrażać wtyczki do tego już i tak bardzo rozbudowanego narzędzia. Na koniec daje prosty przykład konstrukcji rozszerzeń.