以下是一个获取权限的函数,LookupPrivilegeValue 和 OpenProcessToken错误为 997
AdjustTokenPrivileges 为 5,拒绝访问。
这个函数我是从VC翻译过来的,VC源代码见下方。
求高手指点。。function EnablePrivilege (name:pchar):boolean;
var
    hToken:Thandle;
    rv:boolean;
    tp,ss:TOKEN_PRIVILEGES;
    ww: Cardinal;
begin
    tp.PrivilegeCount           := 1 ;
    tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED ;
    LookupPrivilegeValue ( nil, name, tp.Privileges[0].Luid );    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,  hToken );
    showmessage(inttostr(GetLastError ()));
    AdjustTokenPrivileges ( hToken, FALSE, tp, sizeof(TOKEN_PRIVILEGES), ss, ww );    showmessage(inttostr(GetLastError ()));
    rv := (GetLastError () = ERROR_SUCCESS);
    CloseHandle (hToken);
    result := rv;
end;BOOL EnablePrivilege (PCSTR name)
{
    HANDLE hToken;
    BOOL rv;
    
    TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED} };
    LookupPrivilegeValue (
        0,
        name,
        &priv.Privileges[0].Luid
    );   
    OpenProcessToken(
        GetCurrentProcess (),
        TOKEN_ADJUST_PRIVILEGES,
        &hToken
    );
    AdjustTokenPrivileges (
        hToken,
        FALSE,
        &priv,
        sizeof priv,
        0,
        0
    );
 
    rv = GetLastError () == ERROR_SUCCESS;    
    CloseHandle (hToken);
    return rv;
}

解决方案 »

  1.   


    ;   function EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable: Boolean): Boolean;  var    TP: Windows.TOKEN_PRIVILEGES;    Dummy: Cardinal;  begin    TP.PrivilegeCount := 1;    LookupPrivilegeValue(nil, pchar(PrivName), TP.Privileges[0].Luid);    if bEnable then      TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED    else TP.Privileges[0].Attributes := 0;    AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), nil, Dummy);    Result := GetLastError = ERROR_SUCCESS;  end;var  hToken: Cardinal;begin  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);  Result := EnablePrivilege(hToken, SE_DEBUG_NAME, CanDebug);  CloseHandle(hToken);end;