Entwickler-Ecke

Verteilte Systeme - ExitWindowsEx - LogOff Service


csnoopy - So 25.07.10 11:12
Titel: ExitWindowsEx - LogOff Service
hallo leute,

bin im moment etwas verzweifelt. ich habe ein service geschrieben, welches aufgrund eines events an der seriellen schnittstelle einen logoff durchführen soll.

ich habe vorab das ganze in einer form getestet, wo auch alles super funktioniert hat.
jedoch als service funktioniert ein LOGOFF nicht (ein SHUTDOWN komischerweise schon)


C#-Quelltext
1:
2:
3:
4:
[DllImport("user32.dll")]
public static extern int ExitWindowsEx(int operationFlag, int operationReason);

ExitWindowsEx(00);  //(auch mit FORCE 4) ...


habe es auch mit dem Windows Controller von http://mentalis.org/soft/class.qpx?id=7 probiert.


C#-Quelltext
1:
SHUTDOWN (ExitWindowsEx(80);) //funktioniert ein LOGOFF nicht.                    


hat dafür jemand eine erklärung?

thx

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Greenberet - So 25.07.10 16:22

Überprüf mal warum es nicht gegangen ist mit GetLastError

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getlastwin32error%28v=VS.80%29.aspx


jaenicke - So 25.07.10 17:48

Das kann auch nicht gehen. Der Benutzer "System", unter dem der Dienst läuft, kann nicht abgemeldet werden. Deshalb passiert nichts.


csnoopy - So 25.07.10 18:32

wie könnte man das problem lösen?


Kha - So 25.07.10 18:36

Gegenfrage: Was versprichst du dir überhaupt von einem Service?


csnoopy - So 25.07.10 18:49

wollte das ganze als service prgorammieren, da ich mir das ganze "hide form" spielchen ersparen wollte.

im hintergrund läuft microsoft "steady state" (kiosk-pc).

nunja, habe mittlerweile auch WTSDisconnectSession getestet. leider erfolgt hier scheinbar kein logoff sondern nur ein lock des pc´s.

hat noch jemand eine idee?


csnoopy - So 25.07.10 22:21

habe eine funktionierende lösung gefunden - getestet mit windows xp

code für die nachwelt:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
[DllImport("wtsapi32.dll", SetLastError = true)]
static extern bool WTSLogoffSession(IntPtr hServer, int SessionId, bool bWait);

[DllImport("Kernel32.dll", SetLastError = true)]
static extern UInt32 WTSGetActiveConsoleSessionId();

=============================================================

UInt32 WTS_CURRENT_SESSION = UInt32.MaxValue;
IntPtr WTS_CURRENT_SERVER_HANDLE = new IntPtr();

int WTS_CURRENT_SESSION_DISCONNECT = (int)WTSGetActiveConsoleSessionId();
//eventLog1.WriteEntry(WTS_CURRENT_SESSION_DISCONNECT.ToString());
WTSLogoffSession(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION_DISCONNECT, false);



thx all!

Moderiert von user profile iconKha: C#-Tags hinzugefügt