Announcement

Collapse
No announcement yet.

Shutdown/ Reboot und Logoff unter NT

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Shutdown/ Reboot und Logoff unter NT

    Hallo,
    ich habe mir neulich Win2k neu zugelegt.
    In einem Programm habe ich eine Routine, die den Computer herunterfährt, rebootet oder ausloggt. Diese habe ich jedoch nie unter NT getestet. Aber eigentlich müsste sie auch unter NT funktionieren. Stattdessen schließt sich das entsprechende Programm nur selbst anstadt den Copmuter herunter zu fahren.

    <pre>
    function ExitWindows(flag:word):Boolean;
    var vi:TOSVersionInfo;
    hToken:THandle;
    tp:TTokenPrivileges;
    hWord;
    begin
    result:=False;
    vi.dwOSVersionInfoSize:=SizeOf(vi);
    GetVersionEx(vi);
    if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then
    begin
    OpenProcessToken(GetCurrentProcess,
    TOKEN_ADJUST_PRIVILEGES,hToken);
    LookupPrivilegeValue(nil,'SetShutDownPrivilege',
    tp.Privileges[0].Luid);
    tp.PrivilegeCount:=1;
    tp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
    h:=0;
    AdjustTokenPrivileges(hToken,False,tp,0,PTokenPriv ileges(nil^,h);
    CloseHandle(hToken);
    result:= ExitWindowsEx(flag,0);
    end else Result:=ExitWindowsEx(flag,0);
    end;

    Wenn ich den Copmuter herunter fahre Setze ich also

    ExitWindows(ewx_shutdown + EXW_FORCE)

    </pre>

    Bei diesem Aufruf schließt sich das Progranm jedoch nur selbst. Ich hab die Routine nicht selbst entwickelt. Sie stammt aus irgendeinem Buch und dort stand, dass sie unter allen Windows-Versionen funktioniert. Also was ist falsch daran?

  • #2
    <i>*grübel* sicher das es richtig hier reinkopiert ist ?</i><p>
    "AdjustTokenPrivileges(hToken,False,tp,0,PTokenPri vileges(nil^,h);"<br>
    ...sollte eigentlich...<br>
    "AdjustTokenPrivileges(hToken, False, tp, 0, TTokenPrivileges(nil^), DWORD(nil^));"<br>
    ...heißen, denn wenn man NULL ( Typ(nil^) ) für die Variable, die den alten Wert erhalten soll wählt, dann sollten die letzte drei Parameter 0/NULL/NULL sein.

    Gruß Nico

    PS: außerdem fehlen mir da ein-wenig die if-Abfragen =)<br>
    ...und gerade fällt mir auf, es heißt auch "SeShutdownPrivilege" und _nicht_ "SetShutDownPrivilege&quot

    Comment


    • #3
      <pre><p><b>function</b> EnablePrivilegeByName(<b>const</b> Name: <b>string</b>): Boolean;
      <b>var</b>
      Token: THandle;
      NewTp:TTokenPrivileges;
      <b>begin</b>
      Result := False;
      <b>if</b> OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, Token) <b>then</b>
      <b>try</b>
      <b>if</b> LookupPrivilegeValue(<b>nil</b>, PChar(Name), NewTp.Privileges[0].Luid) <b>then</b>
      <b>begin</b>
      NewTp.PrivilegeCount := 1;
      NewTp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      Result := AdjustTokenPrivileges(Token, False, NewTp, 0, TTokenPrivileges(<b>nil</b>^), DWORD(<b>nil</b>^));
      <b>end</b>;
      <b>finally</b>
      CloseHandle(Token);
      <b>end</b>;
      <b>end</b>;
      <p>
      <b>function</b> MachMalZuDieGanzenFensterHier: Boolean;
      <b>const</b>
      SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
      <b>begin</b>
      Result := False;
      <b>if</b> (Win32Platform = VER_PLATFORM_WIN32_NT) <b>then</b>
      <b>begin</b>
      <b>if</b> EnablePrivilegeByName(SE_SHUTDOWN_NAME) <b>then</b>
      Result := ExitWindowsEx(EWX_SHUTDOWN <b>or</b> EWX_FORCE, 0);
      <i>// else ShowMessage('Sie haben nicht das Recht die Sitzung zu beenden!');</i>
      <b>end</b>
      <b>else</b>
      Result := ExitWindowsEx(EWX_SHUTDOWN <b>or</b> EWX_FORCE, 0);
      <b>end</b>;<p></pre>

      Gruß Nico

      PS: das funktioniert zumindest =

      Comment


      • #4
        Hallo,
        Danke für deine Hilfe NikoDE. Werd's gleich ausprobieren.
        Und wie gesagt: Es ist ganz sicher nicht von mir, sondern aus
        einem Buch bzw. von der dazu gehörigen CD. Die Funktion "MachMalZuDieGanzenFensterHier" werde ich glaube ich etwas anders nenen . Das mit "SetShutDownPrivilege" und "SetShutdownPrivilege" ist eigentlich ja egal, da Delphi ja gar nix mit Groß-/Kleinschreibung am Hut hat. Also nehm's mir nicht Übel, wenn ich demnächst "SeTsHuTdOwNPRIVilEgE" schreibe *g*

        Comment


        • #5
          <i>*mal vergrößer*</i><br>
          <h1><font color=red>Se</font>ShutdownPrivilege</h1><br>
          Da ist KEIN t, es heißt nicht SET, sonder SE für "Security"
          Zudem rufst Du eine API Funktion damit auf (wenn es klappt dann hast Du Glück, ich würde es aber nicht darauf ankommen lassen =)

          Gruß Nic

          Comment


          • #6
            lol ich habs schon vorher bemerkt ( gerade als ich aus dem netz war). Aber es gibt doch Leute, die so pingelig. Oder etwa nicht? Naja egal. Danke für die Aufklärung, besonders mit der besonders schönen roten Makierung. Ich dachte du hättest dich verschrieben, aber das tun Informatiker ja generell nicht . Aber trotzdem hab' ich noch nen Problemchen: Wenn ich statt EWX_SHUTDOWN EWX_LOGOFF oder EWX_REBOOT nehme, dann fährt der PC nur runter. Braucht man da andere Privileges ?

            P.S.: SeShutdownPrivilege hört sich doof a

            Comment


            • #7
              Lies http://msdn.microsoft.com/library/en-us/sysinfo/hh/sysmgmt/shutdown_3ago.asp komplett durch. Dann weißt Du welches Flag mit welchem Shutdown-Typ unter welchem OS funktioniert und welche man überhaput kombinieren kann (mir or kombiniert, freilich)...

              Und zu der Frage, nein, es ist das gleiche Recht für LogOff, Reboot und Shutdown.

              Gruß Nico

              PS: Informatiker neigen tendenziell dazu, sich zu verschreiben; ich bin nichtmal Informatiker und deshalb ist bei mir die Wahrscheinlichkeit exponentiell größer =

              Comment


              • #8
                Hallo,

                Zum Shutdown-Recht : habe ich mir schon gedacht

                Zu Postum Scriptum : informatiker verschreiben sich aber seltener als normal sterbliche . Du mußt ja auch kein "reiner" Informatiker sein?

                Comment

                Working...
                X