Das Herunterfahren hat nichts mit Adminrechten zu tun.
Man kann die Gruppe Administratoren und den Benutzer Administrator so einstellen, dass er nichts mehr machen kann.
Es geht nur um das Shutdown Privileg, was Administratoren und Hauptbenutzer normal haben.
Die Privilegien sind immer angepasst! Denn was die Gruppen und Benutzer so mächtig macht, sind eben die Privilegien.
Seht unter den lokalen Kontorichtlinen mit "gpedit.msc" - dem PolicyEditor nach. Da kann man auch dem Gast Shutdownrechte geben.
Zitat von
JB-1990:
das mit den Adminrechten werd ich noch rausbekommen, aber theoretisch braucht man keine, da "Start"-->"Herunterfahren"-->"was auch immer" auch auf die Shutdown.exe zugreifen müsste...
Dein Benuter hat eben das Shutdownprivileg. Und shutdown.exe wird nicht augerufen. Im Gegenteil. Shutdown.exe und jedes andere Programm verwendet die
MSDN API Funktion ExitWindowsEx oder
WMI direkt.
Zitat von
JB-1990:
Zitat von
Dezipaitor:
Außerdem wäre es eine "Herausforderung" die shutdown.exe in allen Rafinessen nachzubauen. Dabei lernt man wirklich eine Menge.
Verwendet shutdown.exe einen Dienst, um die ganzen Dinge, wie Dialoganzeige zu machen? Würde ich mal denken, oder?
Meine Meinung...kein Plan, wie Windows das macht,aber denke ma schon, wäre ma interessant zu wissen, kennt sich jemand damit aus.
RunDLL32.EXE powrprof.dll,SetSuspendState
das funzt, habsch auch schon eingebaut, macht aber wie gesagt nur standby und ich will nicht erst über Standby in den Ruhezustand...hab da was gefunden:
Ruhezustand.bat
powercfg /hibernate on
rundll32.exe powrprof.dll,SetSuspendState
Standby.bat
powercfg /hibernate off
rundll32.exe powrprof.dll,SetSuspendState
Wie kann ich sowas in ein Prog. einbauen ohne gleich die *.bat zu erstellen.
Mit powercfg aktivierst du den Ruhezustand, auch wenn ihn der Benutzer ausgeschaltet hat in der Systemsteuerung. Danach schaltest du ihn explizit aus und der Benutzer kann den Ruhezustand nicht mehr über den Explorer verwenden.
Mit rundll32 rufst du eine Funktion auf, die in der powrprof.dll enthalten ist. Diese Funktion
SetSuspendState kann man direkt aufrufen über Delphi und sogar noch mit Parameter befüllen. Zudem bekommt man Informationen über Fehler.
Ich würde dir empfehlen, direkt die Funktionen zu verwenden und nicht über Batch-Dateien zu gehen. Man verwendet Batch nur dann, wenn mal kurz und einfach etwas benötigt und mein keine Ahnung von Programmierung hat oder der Aufwand dafür zu groß wäre. Für den Zwischenfall gäbe es ja auch noch die MS Windows Skript Sprache, die extra für soetwas gemacht wurde. (sorry keine Ahnung, wie die wirklich heißt).
In der
JEDI Security Code Library gibt es dieses Beispiel, welches versucht den Rechner herunterzufahren. Man kann es natürlich für die anderen Stadien anpassen.
Delphi-Quellcode:
(*
This demonstration tries to shutdown your computer by enabling the
needed privilege and calling the WinAPI-function afterwards.
The shutdown will be cancelled after ten seconds.
*)
program SimpleShutdown;
{$APPTYPE CONSOLE}
uses
SysUtils,
JwaWindows,
JwsclExceptions,
JwsclToken;
var
Token: TJwSecurityToken;
begin
try
Token:=TJwSecurityToken.CreateTokenByProcess(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES
or TOKEN_READ
or TOKEN_QUERY);
except
on E: EJwsclOpenProcessTokenException
do
begin
Writeln(E.
Message);
Readln;
Exit;
end;
end;
try
if Token.PrivilegeAvailable[SE_SHUTDOWN_NAME]
then
begin
Writeln('
SE_SHUTDOWN_NAME is available');
Token.PrivilegeEnabled[SE_SHUTDOWN_NAME]:=True;
end
else
Writeln('
SE_SHUTDOWN_NAME is not available');
finally
FreeAndNil(Token);
end;
if not InitiateSystemShutdown(
nil, '
The computer will be shut down in 60 seconds.', 60, False, False)
then
Writeln(SysErrorMessage(GetLastError))
else
begin
Sleep(10000);
AbortSystemShutdown(
nil);
//stops the shutdown
end;
Readln;
end.