2012-08-06 15 views
5

Próbuję użyć tabeli obiektów uruchomionych, aby uzyskać DTE dla konkretnego wystąpienia programu Visual Studio. Zamierzałem zastosować technikę opisaną na MSDN. Udało mi się uzyskać jedną z instancji do wystawienia, ale nie inne.Opis tabeli uruchomionego obiektu

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

Oto wyniki:

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} 

spodziewałbym się zobaczyć wiele wierszy z VisualStudio.DTE Co robię źle? Czego powinienem się spodziewać?

Edit:

Wydaje podobne do tego, czy aplikacja jest uruchomiona podwyższonych uprawnień. Jeśli jestem konsekwentny i używam trybu normalnego, to działa. Jednak chciałbym, aby działał niezależnie, jak mogę uzyskać ROT dla wszystkich procesów?

+0

działa poprawnie, gdy próbuję go. –

+1

Uruchamiasz kolejną instancję? czy uciekasz, że ten exe jest wyższy? –

+0

@HansPassant co widzisz w swoich wynikach? –

Odpowiedz

8

Uruchamiasz kolejną instancję? czy podnosisz exe?

Kiedy jesteś procesem działającym jako standardowy użytkownik, możesz zobaczyć tylko procesy/etc, które należą do ciebie. Więc nie zobaczysz procesów, które działają jako administrator.

Podczas używania eskalowanych uprawnień można wyświetlić wszystkie procesy należące do wszystkich użytkowników.

Idealnie, wszystko będzie zawsze uruchamiane jako „najmniej uprzywilejowanym użytkownikiem”, patrz http://en.wikipedia.org/wiki/Principle_of_least_privilege

+0

Jakieś wyjaśnienie? Jakie jest oczekiwane zachowanie funkcji GetRunningObjectTable dla różnych uprawnień? –

+1

Czy wolisz zwracać wskaźniki interfejsów, których nigdy nie możesz użyć? –

+0

Podczas gdy @HansPassant jest dość mądry ze względu na swój zwięzły komentarz, bardziej wyczerpująca odpowiedź może zawierać wzmiankę o bezpieczeństwie i izolacji procesu, a konkretnie, umożliwienie nieprostonowanemu procesowi manipulowania podwyższonym może pozwolić procesowi, w którym nie ma poprawek, na wykonywanie czynności, do których nie jest dozwolony. zrobić. Jest to nazywane "eskalacją uprawnień" i jest złą rzeczą. – x0n