2011-07-21 10 views
5

私はなど、たSvchostのように、様々なネットワークプロセスのパスを取得するためのFirefoxをこの関数を作成しました。ここのコードです:GetModuleFileNameExことにより、様々なシステムプロセスのパスを取得していない()

function GetProcessPath(var pId:Integer):String; 
var 
    Handle: THandle; 

begin 
    Result := ''; 
    try 
     Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pID); 
     if Handle <> 0 then 
     begin 
      try 
       SetLength(Result, MAX_PATH); 
       if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then 
        SetLength(Result, StrLen(PChar(Result))) 
       else 
        Result := ''; 
      finally 
       CloseHandle(Handle); 
     end; 
    end; 

    except 
     on E:Exception do 
      ShowMessage(E.ClassName + ':' + E.Message); 
    end; 
end; 

私の問題があるが、私はすべてのプロセスの道を手に入れません。 Firefoxのパスや他の同様のユーザーレベルのプロセスを取得するためにはうまく動作します。しかし、alg、Svchostのようなプロセスでは、私はこの方法でパスを得ることができません。私の推測では、別のAPIを使用する必要があります。この問題を解決するにはどうすればよいですか?

私はWindows XP、32ビットを使用しています。

答えて

8

デバッグ権限を設定する必要があります。ここでは、それがどのように行われるかである。

function NTSetPrivilege(sPrivilege: string; bEnabled: Boolean): Boolean; 
var 
    hToken: THandle; 
    TokenPriv: TOKEN_PRIVILEGES; 
    PrevTokenPriv: TOKEN_PRIVILEGES; 
    ReturnLength: Cardinal; 
begin 
    Result := True; 

    // Only for Windows NT/2000/XP and later. 
    if not (Win32Platform = VER_PLATFORM_WIN32_NT) then Exit; 

    Result := False; 

    // Obtain the processes token 
    if OpenProcessToken(GetCurrentProcess(), 
    TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then 
    begin 
    try 
     // Get the locally unique identifier (LUID) . 
     if LookupPrivilegeValue(nil, PChar(sPrivilege), 
     TokenPriv.Privileges[0].Luid) then 
     begin 
     TokenPriv.PrivilegeCount := 1; // One privilege to set 

     case bEnabled of 
      True: TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; 
      False: TokenPriv.Privileges[0].Attributes := 0; 
     end; 

     ReturnLength := 0; // Replaces a var parameter 
     PrevTokenPriv := TokenPriv; 

     // Enable or disable the privilege 

     AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(PrevTokenPriv), 
      PrevTokenPriv, ReturnLength); 
     end; 
    finally 
     CloseHandle(hToken); 
    end; 
    end; 
end; 

NtSetPrivilege('SeDebugPrivilege', TRUE); // Call this on form create 
+1

おかげでたくさんのオペコードが、それはあなたがVista以降をサポートすることを計画している場合、美しく – CyprUS

+1

1 @CyprUSちょうどUACの問題に注意動作します。 –

関連する問題