Announcement

Collapse
No announcement yet.

Rechner runter fahren

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

  • Rechner runter fahren

    Hallo!

    wie kann man mit delphi ne funktion programmieren die den rechner runter fährt?
    die einhbaute funktion in meinem Tasteneditor scheint wohl bei windows 2000 nicht zu tun!
    ist das betriebssystem abhängig?

    Gruß

    Markus
    Herzliche Grüße

    Markus Lemcke
    barrierefreies Webdesign

  • #2
    Hallo Markus,

    folgende Funktion habe ich, ich meine sogar hier im Forum, gefunden:
    <PRI>
    function TForm1.TimedShutDown(Computer: string; Msg: string; Time: Word; Force: Boolean; Reboot: Boolean): Boolean;
    var
    rl: Cardinal;
    hToken: Cardinal;
    tkp: TOKEN_PRIVILEGES;
    begin
    //get user privileges to shutdown the machine, we are talking about win nt and 2k here
    if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
    ShowMessage('Cannot open process token.')
    else
    begin
    if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
    begin
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    tkp.PrivilegeCount := 1;
    AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
    if GetLastError <> ERROR_SUCCESS then
    ShowMessage('Error adjusting process privileges.');
    end
    else
    ShowMessage('Cannot find privilege value.');
    end;
    Result := InitiateSystemShutdown(PChar(Computer), PChar(Msg), Time, Force, Reboot)
    end;
    </PRE>
    Funktioniert jedenfalls bei mir (WinXP).

    Grüsse Pete

    Comment


    • #3
      Nochmal, hab wahrscheinlich "</PRE> vergessen.

      <PRE>
      function TForm1.TimedShutDown(Computer: string; Msg: string; Time: Word; Force: Boolean; Reboot: Boolean): Boolean;
      var
      rl: Cardinal;
      hToken: Cardinal;
      tkp: TOKEN_PRIVILEGES;
      begin
      //get user privileges to shutdown the machine, we are talking about win nt and 2k here
      if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
      ShowMessage('Cannot open process token.')
      else
      begin
      if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
      begin
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      tkp.PrivilegeCount := 1;
      AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
      if GetLastError <> ERROR_SUCCESS then
      ShowMessage('Error adjusting process privileges.');
      end
      else
      ShowMessage('Cannot find privilege value.');
      end;
      Result := InitiateSystemShutdown(PChar(Computer), PChar(Msg), Time, Force, Reboot)
      end;
      </PRE&gt

      Comment


      • #4
        Ja, es ist Betriebssystem abhänig, da man bei WinNT, Win2k und WinXP erst die berechtigung haben muß, damit das Programm das darf. Wenn das Programm mit administrator rechten läuft, kann man sich die rechte besorgen. Administrator heist nämlich nicht, das man alles darf, wie viele fälchlisch annehmen, Administrator bedeutet, das man sich alle rechte besorgen kann. Ich habe irgend eine Routine mal gehabt, die bis glaube ich bis WinXP ohne Servicepack das ganze gemacht hat.

        <pre>
        function SetShutdownPrivilege(Enable: boolean): boolean;
        var
        PrevPrivileges: TTokenPrivileges;
        Privileges: TTokenPrivileges;
        Token: THandle;
        dwRetLen: DWord;

        const
        cPrivilegeName = 'SeShutdownPrivilege';

        begin
        Result := False;
        OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
        Privileges.PrivilegeCount := 1;
        if LookupPrivilegeValue(nil, PChar(cPrivilegeName), Privileges.Privileges[0].LUID) then
        begin
        if Enable then
        Privileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        else
        Privileges.Privileges[0].Attributes := 0;

        dwRetLen := 0;
        Result := AdjustTokenPrivileges(Token, False, Privileges, SizeOf(PrevPrivileges), PrevPrivileges, dwRetLen);
        end;

        CloseHandle(Token);
        end;

        procedure ExitWin;
        var
        Flags: UINT;
        varShutDownMode: integer;
        varExitForce: boolean;

        begin

        SetShutdownPrivilege(true);
        Flags:=EWX_POWEROFF; // ausschalten
        if varShutDownMode=1 then Flags:=EWX_REBOOT; // Rebooten
        if varShutDownMode=2 then Flags:=EWX_LOGOFF; // Logout
        // Flags:=EWX_SHUTDOWN; // herrunterfahren ohne ausschalten
        if varExitForce then Flags:=Flags and EWX_FORCE;

        if varConfirmation then
        begin
        if MessageDlg('Are you sure?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        begin
        ExitWindowsEx(Flags,0);
        end;

        end
        else
        begin
        ExitWindowsEx(Flags,0);
        end;

        application.ProcessMessages;
        SetShutdownPrivilege(false);
        end;
        </pre>

        Das Programm ist bei mir noch etwas umfangreicher, deswegen weiss ich nicht mehr genau, welche uses man noch angeben muß. Ich habe z.b. die Uses "MMSystem" und "ShellAPI" mit drin. Falls es nicht läuft mal versuchen damit einzubinden

        Comment


        • #5
          vielen Dank ihr beiden
          Herzliche Grüße

          Markus Lemcke
          barrierefreies Webdesign

          Comment

          Working...
          X