Hallo Freunde
,
ich versteh die Welt nicht mehr!
Bisher hat mein Shutdown-Programm (abgesehen von ein paar Ausnahmen wegen Aufhängens seitens NAV
) immer einwandfrei funktioniert!
Jetzt habe ich ein bisschen Code für das Schreiben der Log-Datei geändert und es GEHT NICHT MEHR!
Hier der Code:
Delphi-Quellcode:
procedure TForm1.TiShutdownTimer(Sender: TObject);
var f : textfile;
ConnDetails : TRASConnectionDetails;
Upload, Download, Trennung, SDVerlauf, Volumen : string;
begin
TiShutdown.Enabled := false;
TiCount.Enabled := false;
Upload := '';
Download := '';
Trennung := '';
SDVerlauf := '';
Volumen := '';
//evtl. Verbindung trennen
try
if InternetGetConnectedState(nil, 0) then
begin
RasMonitor.GetRasConnection(ConnDetails);
RasMonitor.HangUpRasConnection(Conndetails.RasConn);
sleep(1500);
getrennt := not InternetGetConnectedState(nil, 0);
if not InternetGetConnectedState(nil, 0) and getrennt
then Trennung := 'Internetverbindung getrennt.'
else Trennung := 'Internetverbindung konnte nicht getrennt werden!';
//evtl. Datenvolumen & Onlinezeit bekommen
if (GetSessionTraffic('In') / 1024 > 1024)
then Download := 'Download: ' + FormatFloat('0.00', GetSessionTraffic('In') / 1024 / 1024) + ' Mb'
else Download := 'Download: ' + FormatFloat('#,##0.00', GetSessionTraffic('In') / 1024) + ' Kb';
if (GetSessionTraffic('Out') / 1024 > 1024)
then Upload := 'Upload: ' + FormatFloat('0.00', GetSessionTraffic('Out') / 1024 / 1024) + ' Mb'
else Upload := 'Upload: ' + FormatFloat('#,##0.00', GetSessionTraffic('Out') / 1024) + ' Kb';
Volumen := ' (' + Upload + '; ' + Download + ')';
Trennung := Trennung + Volumen;
end;
except
Trennung := 'Internetverbindung konnte nicht getrennt werden!';
end;
(*---------Onlinezeit fehlt noch-----------*)
//Logfile schreiben
SDVerlauf := 'Shutdown am '+ DatetoStr(IncSecond(now)) + ' um ' + TimeToStr(now) + ' erfolgreich ausgeführt. ';
assignfile(f, ExtractFilePath(Application.exename) + 'Shutdown.log');
if FileExists(ExtractFilePath(Application.exename) + 'Shutdown.log')
then append(f)
else rewrite(f);
writeln(f, (SDVerlauf + Trennung));
writeln(f, '');
closefile(f);
//Keinen Beenden-Dialog anzeigen
Normalclose := true;
//Windows_Shutdown;
ExitWin(EWX_POWEROFF or EWX_FORCE);
end;
und hier der Code von ExitWin:
Delphi-Quellcode:
function Tform1.ExitWin(Flag : word) : Boolean;
var Version : TOSVersionInfo;
hToken : THandle;
TP : TTokenPrivileges;
h : DWord;
begin
Version.dwOSVersionInfoSize := SizeOf(Version);
GetVersionEx(Version);
if Version.dwPlatformId = VER_PLATFORM_WIN32_NT
then // Windows NT
begin
//Rechte holen
{Achtung bei Delphi 2 muß @hToken stehen ...}
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken);
LookupPrivilegeValue(
nil, '
SeShutdownPrivilege',
TP.Privileges[0].Luid);
TP.PrivilegeCount := 1;
TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
h := 0;
AdjustTokenPrivileges(hToken, false,
TP, 0, PTokenPrivileges(
nil)^, h);
CloseHandle(hToken);
result := ExitWindowsEx(Flag, 0);
end
else // Windows 9x/ME
begin
result := ExitWindowsEx(Flag, 0);
end;
end;
Ich bin mir da auch mit den Parametern etwas unsicher; bisher habe ich immer "EWX_SHUTDOWN or EWX_FORCE" benutzt, um den Computer herunterzufahren und auch auszuschalten (hat auch funktioniert), aber in der
MSDN steht, EWX_SHUTDOWN sei nur zum Herunterfahren bis zu einem Punkt, an dem der PC sicher ausgeschaltet werden könne
Trotzdem hat es immer damit funktioniert!
JETZT funktioniert dieses Flag so, wie es soll: Der PC beendet die Windows-Session und der Bildschirm wird so schwarz und dieser _ blinkt, wie zur Eingabe in DOS (also scheint das dieser Punkt zu sein, an dem ich den PC sicher ausmachen kann?!)
Deshalb habe ich dann "EWX_POWEROFF or EWX_FORCE" ausprobiert, da dies ja den PC eigentlich auch ausschalten soll.... das Ergebnis war, dass der User ausgeloggt wird und man "sein Netzwerkkennwort" eingeben soll und der PC sich sofort wieder einloggt (es gibt nur einen User, mich, und dafür kein Kennwort...)
Ich versteh das einfach nicht! Auch ohne Kombination mit EWX_FORCE passiert genau das gleiche!
Was ist denn da los? Ich hab gar nix an dem Code verändert! Aber Windoof fährt einfach nicht mehr runter, so wie vorher
MfG Lefko