2012-08-06 9 views
5

Sto tentando di utilizzare la tabella degli oggetti in esecuzione per ottenere un DTE un'istanza specifica di Visual Studio. Intendevo usare la tecnica descritta su MSDN. Sono riuscito a ottenere una delle istanze da elencare, ma non le altre.Informazioni sulla tabella degli oggetti in esecuzione

public static void PrintRot() 
{ 
    IRunningObjectTable rot; 
    IEnumMoniker enumMoniker; 
    int retVal = GetRunningObjectTable(0, out rot); 

    if (retVal == 0) 
    { 
     rot.EnumRunning(out enumMoniker); 

     IntPtr fetched = IntPtr.Zero; 
     IMoniker[] moniker = new IMoniker[1]; 
     while (enumMoniker.Next(1, moniker, fetched) == 0) 
     { 
      IBindCtx bindCtx; 
      CreateBindCtx(0, out bindCtx); 
      string displayName; 
      moniker[0].GetDisplayName(bindCtx, null, out displayName); 
      Console.WriteLine("Display Name: {0}", displayName); 
     } 
    } 
} 

[DllImport("ole32.dll")] 
private static extern void CreateBindCtx(int reserved, out IBindCtx ppbc); 

[DllImport("ole32.dll")] 
private static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot); 

Ecco i risultati:

Display Name: !VisualStudio.DTE.11.0:7120 
Display Name: clsid:331F1768-05A9-4DDD-B86E-DAE34DDC998A: 
Display Name: !{7751A556-096C-44B5-B60D-4CC78885F0E5} 
Display Name: c:\users\dave\documents\visual studio 2012\Projects\MyProj\MyProj.sln 
Display Name: !{059618E6-4639-4D1A-A248-1384E368D5C3} 

mi sarei aspettato di vedere più righe con VisualStudio.DTE Che cosa sto facendo di sbagliato? Cosa dovrei aspettarmi di vedere?

Edit:

Sembra legato al fatto che l'applicazione è in esecuzione privilegi elevati. Se sono coerente e uso la modalità normale, allora funziona. Tuttavia, mi piacerebbe che funzionasse a prescindere, come faccio a ottenere il ROT per tutti i processi?

+0

funziona bene quando ho provato. –

+1

stai eseguendo un'altra istanza elevata? stai runnign questo exe elevato? –

+0

@HansPassant cosa vedi nei risultati? –

risposta

8

stai eseguendo un'altra istanza elevata? stai correndo l'exe elevato?

Quando si esegue un processo come utente standard, è possibile visualizzare solo i processi/ecc. Che appartengono a voi. Quindi non vedresti processi in esecuzione come amministratore.

Durante l'esecuzione con priviliges escalated, è possibile visualizzare tutti i processi appartenenti a tutti gli utenti.

Idealmente, tutto sarebbe sempre eseguito come "utente meno privilegiato", vedi http://en.wikipedia.org/wiki/Principle_of_least_privilege

+0

Qualche spiegazione? Cosa si aspetta il comportamento di GetRunningObjectTable per diversi privilegi? –

+1

Preferisci che restituisca dei puntatori all'interfaccia che non puoi mai usare? –

+0

Mentre @HansPassant è piuttosto saggio con il suo commento conciso, una risposta più informativa potrebbe implicare un accenno alla sicurezza e all'isolamento dei processi, in particolare, consentendo a un processo non elevato di manipolare uno elevato potrebbe consentire al processo non previsto di fare cose a cui non è permesso fare. Questo è chiamato "escalation di privilegi" ed è una brutta cosa. – x0n