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>
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>
Comment