Voor beheer op afstand applicatie worden computers automatisch aan en uit gezet.
Dit gaat via het volgende commando:
flg kan EWX_SHUTDOWN of EXW_REBOOT zijn.
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
(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?
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
Nu dacht ik: ah dat is de oplossing, dus ik heb de laatste regel in het eerste code voorbeeld veranderd naar: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.
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?