Announcement

Collapse
No announcement yet.

ExitWindowsEx unter WinNT/Win2000

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

  • ExitWindowsEx unter WinNT/Win2000

    Hallo !

    Mit dem Aufruf

    z.B.: ExitWindowsEx(0, EWX_POWEROFF)

    kann man ja den Rechner runterfahren - und bei ATX - ausschalten lassen. Nun gibt es aber unter WinNT und Win2000 'Einschränkungen' in der Benutzung dieser Funktion durch diverse Privilegien. Wie schaffe ich es mir die notwendigen Privilegien (?AdjustTokenPrivileges()?) zuzuweisen?

    Vielen Dank für die Hilfe

  • #2
    Hallo,

    probiere einmal die folgende Funktion aus. Wenn Sie TRUE zurückliefert, sollte das notwendige Privileg erfolgreich gesetzt worden sein:

    <pre>
    function GetShutdownPrivilege:Boolean;
    const
    SHN : PChar = 'SeShutdownPrivilege';
    EMP : PChar = '';
    var
    hToken : THandle;
    tkp,p : TTokenPrivileges;
    RetLen : Integer;
    Err : DWord;
    begin
    if not OpenProcessToken(GetCurrentProcess,
    TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY,@hToken) then
    begin
    Result := False;
    Exit;
    end;

    if not LookupPrivilegeValue(EMP,SHN,tkp.Privileges[0].Luid) then begin
    Result := False;
    Exit;
    end;
    tkp.PrivilegeCount := 1;
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken,False,tkp, SizeOf(TTokenPrivileges),p,RetLen);
    Err := GetLastError;
    if Err <> ERROR_SUCCESS then
    begin
    Result := False;
    Exit;
    end;
    Result := True;
    end;
    </pre&gt

    Comment


    • #3
      <pre>
      Hallo,

      ich habe etwas Probleme diese Routine zu kompilieren:
      D5-Pro meldet:

      bei Aufruf OpenProcessToken:
      [Fehler] Unit1.pas(44): Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen

      bei Aufruf AdjustTokenPrivileges:
      [Fehler] Unit1.pas(55): Es gibt keine überladene Version von 'AdjustTokenPrivileges', die man mit diesen Argumenten aufrufen

      Ist diese Routine evtl. mit einer älteren Version oder C/S
      erstellt worden???
      Vielleicht hat ja jemand einen Tipp, bevor ich länger suche..
      Gruß
      Max
      </pre&gt

      Comment


      • #4
        Hallo,

        mit Delphi 5 sollte die folgende Fassung erfolgreich arbeiten:
        <pre>
        procedure GetShutdownPrivilege;
        const
        SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
        type
        TLUID = TLargeInteger;
        var
        currToken : THandle;
        prevState,
        newState : TTokenPrivileges;
        prevStateLen : DWORD;
        uid : TLUID;
        begin
        OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, currToken);
        LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, uid);
        newState.PrivilegeCount := 1;
        newState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        newState.Privileges[0].Luid := uid;
        AdjustTokenPrivileges(currToken, False, newState, sizeof(TTokenPrivileges),
        prevState, prevStateLen);
        if GetLastError <> ERROR_SUCCESS then
        RaiseLastWin32Error;
        end;
        </pre&gt

        Comment


        • #5
          <pre>
          Hallo Andreas,

          Danke für die superschnelle Hilfe...
          Kompilierung funktioniert nun einwandfrei
          (warum, muss ich mir nun mal in Ruhe anschauen.. ;-)
          Der Rechner (ATX) rebootet allerdings trotz EWX_POWEROFF.
          aber das ist ja wohl ein anderes Thema.

          Gruß
          Max

          </pre&gt

          Comment

          Working...
          X