Announcement

Collapse
No announcement yet.

Programm mit Administratorrechten ausführen oder starten

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

  • Programm mit Administratorrechten ausführen oder starten

    Hallo zusammen.<br>
    Ich habe folgendes Problem:<br>
    Mein Programm muß mit (lokalen) Administratorrechten laufen, bzw. gestartet werden. Ich habe in einer anderen Dikussion schon ein Beispiel gefunden ( Anwort von Herrn Kosch u.a. ). Leider liefert dieser Quellcode bei mir nur folgenden Fehler:<br>
    Systemfehler. Code:1314. Der Client besitzt ein erforderliches Recht nicht.<br>
    Und hier mein Code:<br>
    <pre>
    var
    path : String;
    prog : String;
    filename : String;
    // login as admin
    phToken : THandle;
    bRet : LongBool;
    dwSize : DWord;
    szBuffer : array[0..63] of Char;
    // need more privilegs
    hToken : THandle;
    tp : TTokenPrivileges;
    outtp : PTokenPrivileges;
    ol : PDWord;
    lUid : TLargeInteger;
    begin
    path := 'h:\$_teile';
    prog := '\Linfo.exe';
    filename := path + prog;
    if FileExists( filename ) then
    begin
    // get more privileges
    if not OpenProcessToken( GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken ) then Abort;

    if not LookupPrivilegeValue( nil, 'SeAssignprimarytokenPrivilege', lUid ) then abort;
    tp.PrivilegeCount := 1;
    tp.Privileges[0].Luid := lUid;
    tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    outtp := nil;
    ol := nil;
    if not AdjustTokenPrivileges( hToken, False, tp, sizeof( TTokenPrivileges ), outtp^, ol^ ) then Abort;

    if not LookupPrivilegeValue( nil, 'SeIncreaseQuotaPrivilege', lUid ) then abort;
    tp.PrivilegeCount := 1;
    tp.Privileges[0].Luid := lUid;
    tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    outtp := nil;
    ol := nil;
    if not AdjustTokenPrivileges( hToken, False, tp, sizeof( TTokenPrivileges ), outtp^, ol^ ) then Abort;

    if GetLastError() <> ERROR_SUCCESS then Abort;

    // logon as admin
    bRet := LogonUser( 'Administrator', 'Gruppe', 'password', LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, phToken );
    if bRet then
    begin
    bRet := ImpersonateLoggedOnUser( phToken );
    dwSize := SIZEOF( szBuffer );
    GetUserName( szBuffer, dwSize );
    MessageBox( 0, PChar( 'UserName = ' + szBuffer ), 'Hinweis', MB_OK or MB_ICONASTERISK );
    // start program
    shellexecute( 0, 'open', PChar( filename ), '', nil, sw_shownormal );
    // back to normal user
    bRet := RevertToSelf;
    dwSize := SIZEOF( szBuffer );
    GetUserName( szBuffer, dwSize );
    MessageBox( 0, PChar( 'UserName = ' + szBuffer ), 'Hinweis', MB_OK or MB_ICONASTERISK );
    end
    else
    begin
    Win32Check( bRet );
    shellexecute( 0, 'open', PChar( filename ), '', nil, sw_shownormal );
    end;
    end
    else
    MessageBox( 0, PChar( 'Datei ' + filename + ' nicht gefunden!' ), 'Fehler', MB_OK or MB_ICONERROR );
    end.</pre><br>
    Meine Umgebung sind: W2K PRO, Delphi 7 Enterpr., lokale Adminrechte sind auch unter meinem Account schon vorhanden.<br>
    Wer kann mir hier weiter helfen?<br>
    Es ist wirklich dringend!!!
Working...
X