Centrum Skryptóe - Microsoft Office

Jak uruchomić skrypt przy każdym włączeniu programu Outlook?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak uruchomić skrypt przy każdym włączeniu programu Outlook?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak uruchomić skrypt przy każdym włączeniu programu Outlook?

-- AT

Cześć Skrypciarze! Odpowiedź

Cześć, AT. Zapewne próbowaliście kiedyś załatwić coś w urzędzie skarbowym przez telefon. Jak wiadomo, w odróżnieniu do załatwiania czegoś osobiście, załatwianie czegoś przez telefon ma tę zaletę, że nie trzeba tego załatwiać osobiście – wystarczy się dogadać przez telefon. Kluczowe słowo: dogadać się. Z tym jest największy problem. Tylko nie wiem, z czego on wynika. Z ogromnej niekompetencji czy z czystej złośliwości? Zacznę może od początku:

– Dzień dobry, potrzebuję informacji o zaświad…

– To ja pana przełączę do działu zaświadczeń…

– Witam, potrzebuję informacji, ponieważ chcę złożyć wniosek o zaświadczenie…

– To ja pana przełączę do koleżanki, ona się zajmuje wnioskami…

– Witam, potrzebuję informacji, ponieważ chcę przesłać faksem wniosek o zaświadczenie o niezaleganiu z podatkami.

– No ale jak to faksem?

– Nie mogę przyjechać osobiście i chcę…

– To ja pana przełączę do kierownika, on zdecyduje, czy tak można.

To wcale nie żarty. Ale pan kierownik powiedział, że nie ma problemu i nawet podał numer faksu. Cudownie. Nic prostszego. Trzeba się tylko przebić przez ten mur i dotrzeć do informacji.

Ale czyż to nie jest normalne zjawisko, że jeżeli tylko chcemy zrobić coś, co nie pasuje do jakiegoś schematu, to sami musimy się dokształcić w zakresie tego, jak to zrobić, żeby osiągnąć ten sam efekt?

Dobrze, że chociaż w rubryce Cześć, Skrypciarze jest inaczej. Wystarczy zadać pytanie i spokojnie czekać na odpowiedź. Nie trzeba się dopytywać, przebijać, denerwować. Pytasz i masz.

Jakie to mamy pytanie na dzisiaj? O skrypt uruchamiający inny skrypt przy każdym włączeniu programu Outlook na komputerze? Oto on:

Set objShell = CreateObject("Wscript.Shell")



strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colMonitoredProcesses = objWMIService. _        

    ExecNotificationQuery("Select * from __InstanceCreationEvent " _ 

        & " Within 1 Where TargetInstance ISA 'Win32_Process' AND " & _

            "TargetInstance.Name = 'Outlook.exe'")



Do While True

    Set objProcess = colMonitoredProcesses.NextEvent

    objShell.Run "cscript.exe C:\Scripts\Test.vbs"

Loop

Jak widać, nie jest on zbyt skomplikowany. Zaczynamy od utworzenia wystąpienia obiektu Wscript.Shell; ten obiekt umożliwi nam uruchomienie jednego skryptu wewnątrz drugiego. Po utworzeniu obiektu Wscript.Shell łączymy się z usługą WMI na lokalnym komputerze. Tak, można zastosować ten skrypt również do monitorowania użycia programu Outlook na zdalnym komputerze. Jeżeli o to właśnie chodzi, wystarczy przypisać nazwę tego komputera do zmiennej o nazwie strComputer:

strComputer = "atl-fs-001"

To nas prowadzi do tego … interesującego … fragmentu kodu:

Set colMonitoredProcesses = objWMIService. _        

    ExecNotificationQuery("Select * From __InstanceCreationEvent " _ 

        & " Within 1 Where TargetInstance ISA 'Win32_Process' AND " & _

            "TargetInstance.Name = 'Outlook.exe'")

To jest skrypt wewnątrz skryptu, w którym dokonujemy “subskrypcji zdarzeń”; innymi słowy, w tym miejscu informujemy skrypt, na co ma zwrócić uwagę. Nie wyjaśnię dzisiaj szczegółowo subskrypcji zdarzeń; więcej informacji można znaleźć w artykule Tales From the Script (j.ang.) poświęconym zdarzeniom WMI lub webcaście (j.ang.) na ten sam temat. To, o czym dziś opowiem, to fakt, że ta kwerenda żąda informacji przy każdym utworzeniu nowego wystąpienia klasy __InstanceCreationEvent; jak sama nazwa wskazuje, nowe wystąpienie tej klasy jest tworzone przy każdym utworzeniu nowego wystąpienia obiektu kompatybilnego z WMI (procesu, stacji dysku, usługi, zdarzenia dziennika zdarzeń, itp.).

Nam oczywiście nie chodzi o każdy nowoutworzony obiekt kompatybilny z WMI. (To byłby kiepski pomysł: w ciągu minuty na komputerze może zostać utworzonych całe mnóstwo nowych obiektów.) Chcemy natomiast otrzymywać powiadomienia tylko w przypadku, gdy obiekty będą spełniały dwa warunki:

  • Dany obiekt jest procesem. Do tego służy klauzula TargetInstance ISA 'Win32_Process'. (Nawiasem mówiąc: TargetInstance to sposób usługi WMI na odnoszenie się do nowego obiektu, który uruchomił nasz skrypt monitorowania zdarzeń.)
  • Nazwa Name danego obiektu ma wartość Outlook.exe. Jeżeli na komputerze uruchomi się nowy proces o nazwie Outlook.exe, są duże szanse, że na tym komputerze uruchomiony został program Outlook.

Po skonfigurowaniu subskrypcji zdarzeń, uruchamiamy pętlę Do While, która będzie działać wiecznie (a przynajmniej dopóki wartość True się nie zmieni):

Do While True

Nawiasem mówiąc, jest to jeden z powodów, dla których zalecamy uruchomienie tego skryptu (i wszystkich innych skryptów monitorujących) w oknie polecenia obsługiwanym przez hosta skryptu CSscript. Dzięki temu możemy zakończyć działanie skryptu, naciskając Ctrl+C w oknie polecenia lub po prostu zamykając okno polecenia.

Wewnątrz pętli najpierw wykonujemy poniższy wiersz kodu:

Set objProcess = colMonitoredProcesses.NextEvent

Dzięki temu poleceniu skrypt będzie spokojnie czekał na utworzenie nowego zdarzenia (czyli utworzenie nowego procesu o nazwie Outlook.exe). Co się stanie, jeżeli nigdy nie uruchomimy programu Outlook na tym komputerze? Nic, skrypt będzie cierpliwie czekał (wykorzystując minimalną ilość zasobów), dopóki program Outlook nie zostanie w końcu uruchomiony lub nie zakończymy procesu skryptu.

Co się z kolei stanie, jeżeli program Outlook zostanie uruchomiony? Cóż, w takim przypadku, zastosujemy obiekt Wscript.Shell oraz metodę Run w celu uruchomienia skryptu C:\Scripts\Test.vbs (i znowu wybieramy uruchomienie tego skryptu jako CScript):

objShell.Run "cscript.exe C:\Scripts\Test.vbs"

Po uruchomieniu Test.vbs kontynuujemy działanie pętli i czekamy na następne powiadomienie o zdarzeniu.

To powinno na dzisiaj wystarczyć. Ja mam przed sobą wieczór z wypełnianiem wniosków. Do zobaczenia jutro.

 Do początku strony Do początku strony

Centrum Skryptóe - Microsoft Office