2009-08-22 8 views
1

Ist es möglich, Herunterfahren Grund in Windows Server 2008 sofort nachdem Benutzer den Grund im Dialogfeld wählen? Für das Shutdown-Ereignis verwende ich SystemEvents.SessionEnding. Ich möchte Windows-Dienst schreiben, der E-Mail über dieses Ereignis senden wird.Get Windows Server-Herunterfahren Grund in C#

Oder gibt es eine andere Möglichkeit im Windows-Server E-Mails über Shutdown/Neustart-Ereignis mit dem Grund vom Benutzer eingegeben zu senden? Ich möchte auch über die Änderung der Stromquelle (elektrische Leitung/Batterie) informieren, aber das habe ich bereits durch Kernel32.dll> GetSystemPowerStatus gelöst.

Antwort

5

Sie können den Grund für die Abschaltung erhalten, wenn Sie das EventLog untersuchen.

Ich habe eine kurze Demo zu Windows Forms zusammengestellt, die Sie an Ihren Windows-Dienst anpassen können.

Ich habe eine EventLog-Komponente zum Formular hinzugefügt und ordnungsgemäß konfiguriert. Das folgende Snippet zeigt den in InitializeComponent() generierten Code für die Einstellungen, die ich über den Designer vorgenommen habe.


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); 

Auf den Event-Handler, werden Sie etwas in den folgenden Zeilen haben:


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); 
    } 
} 

einen Blick auf Ihrem Ereignisprotokoll Nehmen Sie die entsprechende EventIDs zu sehen heraus zu filtern. Der Compiler wird Sie warnen, dass EventID veraltet ist und Ihnen sagen, dass Sie InstanceId verwenden sollten, aber in den Schnelltests, die ich hier gemacht habe, hat es nicht in meine Protokolldatei geschrieben und ich denke, wir haben bereits genug Informationen um dich auf den richtigen Weg zu bringen.

0

sicher ist es möglich. Wenn Sie diesen Wert für comboBox in Echtzeit abrufen möchten, müssen Sie einen Thread-Monitor für diesen Prozess ausführen, um ein Ereignis auszulösen, wenn sich dieser Wert ändert.