[C#] EWX_FORCEIFHUNG afsluiten ook als programma crashed

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Voor beheer op afstand applicatie worden computers automatisch aan en uit gezet.

Dit gaat via het volgende commando:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void ShutdownComputer(int flg)
        {
            bool ok;
            TokPriv1Luid tp;
            IntPtr hproc = GetCurrentProcess();
            IntPtr htok = IntPtr.Zero;
            ok = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
            tp.Count = 1;
            tp.Luid = 0;
            tp.Attr = SE_PRIVILEGE_ENABLED;
            ok = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
            ok = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);            

            ok = ExitWindowsEx(flg, 0);            
        }

flg kan EWX_SHUTDOWN of EXW_REBOOT zijn.

C#:
1
2
[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
        internal static extern bool ExitWindowsEx(int flg, int rea);


Niet door mij geschreven trouwens deze code :).

Nu staat op een van de computers een applicatie die soms crashed tijdens het afsluiten, nu kan ik hier helaas niets aan doen (niet mijn app). Maar dit zorgt er wel voor dat de applicatie een foutmelding geeft na 20 seconden, om de computer toch te laten afsluiten moet ik dan remote inloggen, op "nu beindingen" drukken en dan sluit de computer zich af.

Als de computer zichzelf niet goed afsluit, kan deze later ook weer niet aan, en dat is nogal een probleem :).

Nu las ik hier: http://msdn.microsoft.com/en-us/library/aa376868(VS.85).aspx over de flag EWX_FORCEIFHUNG
Forces processes to terminate if they do not respond to the WM_QUERYENDSESSION or WM_ENDSESSION message within the timeout interval. For more information, see the Remarks.
Nu dacht ik: ah dat is de oplossing, dus ik heb de laatste regel in het eerste code voorbeeld veranderd naar:
C#:
1
ok = ExitWindowsEx(flg & EWX_FORCEIFHUNG, 0);            

(flg is dus EXW_SHUTDOWN of EXW_REBOOT).

Mooi gepiept dacht ik. Dus ik run dit even in Visual Studio, begrijpelijk wik VS niet afsluiten, er komt een afsluit teller, na 20 seconden zit deze vol... En dan krijg ik een foutmelding dat het programma niet reageert, niks forceifhung of wat dan ook.

Het lijkt er dus op of ik iets niet goed doe. Ik zit trouwens niet heel erg vast aan de code die er nu is. (Gewoon standaard C# shutdown computer scriptje). Dus als het op een andere manier beter kan, dan hoor ik het graag. Maar ik neem aan dat normaliter EWX_SHUTDOWN & EXW_FORCEIFHUNG als argument voor ExitWindowsEx uit user32.dll genoeg zou moeten zijn.

Alleen EWX_FORCE(IFHUNG) mee geven werkt niet (maar dat is opzich logisch).

Iemand een idee?

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Sinds wanneer combineer je flags met '&'? ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
... * roy-t schrijft een betoog waarom dat zo moet..

... kwartje valt.

Arg dat moet met '|' (OR) natuurlijk! :(

Gek genoeg: flg | EWX_FORCEIFHUNG werkt dus ook niet. Zie ik nog iets over het hoofd?

Edit: forceifhung lijkt nog steeds niet te werken, maar met flg | EXW_FORCE gebeurt er wel precies wat ik wil. Bedankt pedorus, deze domme fout had ik compleet over het hoofd gezien.

* roy-t add dit topic tussen de andere beschamende topics die ik wel eens gemaakt heb.

[ Voor 90% gewijzigd door roy-t op 09-04-2010 13:33 ]

~ Mijn prog blog!