2011-03-03 1 views
5

J'ai une collection d'objets win32_process interrogés à partir d'une machine distante en utilisant WMI. Comment puis-je déterminer si chaque processus est 32 bits ou 64 bits?En utilisant WMI, comment puis-je déterminer si un processus distant est en 32 bits ou en 64 bits?

+0

Quelle langue utilisez-vous? – Helen

+0

J'utilise C# en utilisant .NET 3.5 – musaul

+2

Connexes: [Comment déterminer si un System.Diagnostics.Process est 32 ou 64 bits?] (Http://stackoverflow.com/q/3575785/113116) – Helen

Répondre

1

WMI ne possède pas cette fonctionnalité. La solution consiste à tester le Handle de chaque processus en utilisant IsWow64Process via P/Invoke. This code devrait vous aider à avoir l'idée.

+0

Merci. Je vais essayer.Très étrange qu'ils n'ont pas un moyen d'identifier cela dans la classe de processus, ou même dans l'API .NET d'ailleurs. – musaul

0

Essayez ceci:

/// <summary> 
/// Retrieves the platform information from the process architecture. 
/// </summary> 
/// <param name="path"></param> 
/// <returns></returns> 
public static string GetPlatform(string path) 
{ 
    string result = ""; 
    try 
    { 
     const int pePointerOffset = 60; 
     const int machineOffset = 4; 
     var data = new byte[4096]; 
     using (Stream s = new FileStream(path, FileMode.Open, FileAccess.Read)) 
     { 
      s.Read(data, 0, 4096); 
     } 
     // Dos header is 64 bytes, last element, long (4 bytes) is the address of 
     // the PE header 
     int peHeaderAddr = BitConverter.ToInt32(data, pePointerOffset); 
     int machineUint = BitConverter.ToUInt16(data, peHeaderAddr + 
                 machineOffset); 
     result = ((MachineType) machineUint).ToString(); 
    } 
    catch { } 

    return result; 
} 



public enum MachineType 
{ 
    Native = 0, 
    X86 = 0x014c, 
    Amd64 = 0x0200, 
    X64 = 0x8664 
} 
+0

Gardez à l'esprit que ce processus est précis, mais a tendance à être un peu lourd avec suffisamment de processus dans la file d'attente. J'appelle cela par processus dans un autre thread pour alléger l'interface utilisateur. – Xcalibur37

+0

Vous écrivez ce code en C#. Une langue dont les fichiers EXE peuvent s'exécuter en mode 32 bits ou 64 bits. Vous ne pouvez pas dire à partir de l'en-tête EXE. –

+0

Vous pouvez compiler vers une plate-forme spécifique. Sinon, pourquoi avoir 2 versions différentes du même exécutable? – Xcalibur37

Questions connexes