2009-08-22 4 views
1

Est-il possible d'obtenir une raison d'arrêt dans Windows Server 2008 immédiatement après que l'utilisateur ait choisi la raison dans la fenêtre de dialogue? Pour l'événement shutdown j'utilise SystemEvents.SessionEnding. Je veux écrire le service Windows, qui enverra un courriel à propos de cet événement.Obtenir la raison de l'arrêt de Windows Server en C#

Ou existe-t-il un autre moyen dans le serveur Windows pour envoyer des e-mails sur l'événement shutdown/restart avec la raison entrée par l'utilisateur? En outre, je tiens à informer sur le changement de source d'alimentation (ligne électrique/batterie), mais cela j'ai déjà résolu par Kernel32.dll> GetSystemPowerStatus.

Répondre

5

Vous pouvez obtenir la raison de l'arrêt en inspectant le journal des événements.

J'ai assemblé une démo rapide sur Windows Forms que vous pouvez adapter à votre service Windows.

J'ai ajouté un composant EventLog au formulaire et l'ai configuré correctement. L'extrait ci-dessous montre le code généré dans InitializeComponent() pour les paramètres que j'ai définis dans le concepteur.


this.eventLog1.EnableRaisingEvents = true; 
this.eventLog1.Log = "System"; 
this.eventLog1.Source = "USER32"; 
this.eventLog1.SynchronizingObject = this; 
this.eventLog1.EntryWritten += new System.Diagnostics.EntryWrittenEventHandler(this.eventLog1_EntryWritten); 

Sur le gestionnaire d'événements, vous aurez quelque chose le long des lignes suivantes:


private void eventLog1_EntryWritten(object sender, System.Diagnostics.EntryWrittenEventArgs e) 
{ 
    EventLogEntry entry = e.Entry; 
    if (e.Entry.EventID == 1074) 
    { 
     File.AppendAllText(@"c:\message.txt", entry.Message); 
    } 
} 

Jetez un oeil à votre journal des événements pour voir les EventIds appropriées pour filtrer.

Le compilateur vous avertira que EventID est obsolète et vous indiquera que vous devez utiliser InstanceId, mais dans les tests rapides que j'ai effectués ici, il n'a pas écrit dans mon fichier journal et je pense que nous avons déjà assez d'informations pour vous mettre sur la bonne voie.

0

Assurez-vous que c'est possible. Dans le cas où vous souhaitez obtenir cette valeur comboBox en temps réel, vous devrez exécuter un moniteur Thread sur ce processus pour déclencher un événement lorsque cette valeur change.

Questions connexes