2012-08-06 6 views
5

Ich versuche, die Tabelle laufender Objekte zu verwenden, um eine DTE für eine bestimmte Instanz von Visual Studio abzurufen. Ich beabsichtigte, die Technik zu verwenden, die auf MSDN beschrieben wird. Ich habe es geschafft, eine der Instanzen zur Liste zu bringen, aber nicht die anderen.Grundlegendes zur laufenden Objekttabelle

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); 

Hier sind die Ergebnisse:

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} 

Ich würde erwarten, mehrere Zeilen mit VisualStudio.DTE zu sehen, Was mache ich falsch? Was soll ich erwarten?

Edit:

Es scheint damit zusammen, ob die App erhöhten Rechten ausgeführt wird. Wenn ich konsistent bin und den normalen Modus nutze, funktioniert es. Wie auch immer, ich möchte, dass es funktioniert, wie bekomme ich den ROT für alle Prozesse?

+0

fein funktioniert, wenn ich es versuchen. –

+1

führen Sie eine andere Instanz erhöht? Bist du runnign diese exe erhöht? –

+0

@HansPassant Was siehst du in deinen Ergebnissen? –

Antwort

8

führen Sie eine andere Instanz erhöht aus? Führst du die exe erhöht?

Wenn Sie ein Prozess sind, der als Standardbenutzer ausgeführt wird, können Sie nur Prozesse/etc sehen, die Ihnen gehören. Sie sehen also keine Prozesse, die als Administrator ausgeführt werden.

Beim Ausführen mit eskalierten Privilegien können Sie alle Prozesse sehen, die zu allen Benutzern gehören.

Im Idealfall würde alles immer laufen als die „am wenigsten privilegierte Benutzer“, siehe http://en.wikipedia.org/wiki/Principle_of_least_privilege

+0

Eine Erklärung? Wie wird das Verhalten von GetRunningObjectTable für verschiedene Berechtigungen erwartet? –

+1

Würden Sie bevorzugen, dass es Schnittstellenzeiger zurückgibt, die Sie nie benutzen können? –

+0

Während @HansPassant mit seinem prägnanten Kommentar ziemlich weise ist, könnte eine informativere Antwort eine Erwähnung von Sicherheit und Prozessisolierung beinhalten, genauer gesagt erlaubt es einem nicht erhöhten Prozess, einen erhöhten zu manipulieren, dem unerfahrenen Prozess zu erlauben, Dinge zu tun, die nicht erlaubt sind machen. Dies wird als "Eskalation von Privilegien" bezeichnet und ist eine schlechte Sache. – x0n