Announcement

Collapse
No announcement yet.

AdjustTokenPrivileges scheitert

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

  • AdjustTokenPrivileges scheitert

    Hallo zusammen,

    ich bin als Benutzer mit admin-Rechten auf einem w2k-client in einem NT-Netz eingeloggt.
    Nachfolgende Unit meldet mir immer den Fehler 1314.
    AdjustTokenPrivileges meldet, dass es nicht alle Privilegien hat enablen können.
    Also dürfte das Privileg 'SeTCBName' fehlen. Nur wie kann ich dies dem Prozess zuweisen.

    Wundert Euch nicht über die Unit, ich habe sie nur so viel angepasst, wie
    ich es zum Testen brauchte.

    Grüße,
    Thomas Brunner
    ************************
    <pre>
    unit Unit1b;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls;

    type
    TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    procedure ExitWindows32(ShutDownFlag: Word);
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.ExitWindows32(ShutDownFlag: Word);

    function ChangeNTSecurityForShutdown: Boolean;
    var
    hToken : THandle;
    tkp,
    Newt : TTokenPrivileges;
    retlength : DWORD;
    begin
    Result := False;
    if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES +
    TOKEN_QUERY, hToken) <> False then
    begin
    { Get the LUID for shutdown privilege }
    if LookupPrivilegeValue( nil, 'SeTcbPrivilege',
    tkp.Privileges[0].Luid) = True then
    begin
    tkp.PrivilegeCount := 1; // One to set
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    { Get shutdown privilege for this process }
    Result := AdjustTokenPrivileges(hToken, False, tkp,
    SizeOf(TTokenPrivileges), Newt,
    retlength);
    end;
    end;
    end;
    var
    LogonHandle:THandle;
    begin
    if ChangeNTSecurityForShutdown then
    begin
    if not LogonUser(
    PChar('recos4'),
    PChar('recos'),
    PChar('recos14'),
    LOGON32_LOGON_NETWORK,
    LOGON32_PROVIDER_DEFAULT,
    LogonHandle
    ) then
    begin
    showmessage(inttostr(GetLastError))
    end;
    end
    else
    MessageDlg('Unable to modify security rights for shutdown
    privileges.', mtError, [mbOK], 0);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ExitWindows32(8); {8 ist dummy}
    end;

    end
    </pre>

  • #2
    Hallo, <p>folgender Aufruf funktioniert mit Delphi 5.0 sowohl unter NT als auch Windows 2000.
    <pre>
    const
    SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';<p>
    procedure WindowsNT;
    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


    • #3
      Das stimmt, wenn das entsprechende Prilileg "da" ist.
      Mit SE_PRIVILEGE_ENABLED wird das Recht nur akitviert oder deaktiviert.<br>
      Wenn ich aber mit GetTokenInformation... die Privilege auslese, ist es gar nicht vorhanden. Ich muß es also erst erzeugen und zwar muss es für jeden Benutzer möglich sein.

      Grüße,
      Thomas Brunne

      Comment

      Working...
      X