2012-08-06 97 views
5

我正在尝试使用运行对象表来获取DTE特定的Visual Studio实例。我打算使用MSDN上描述的技术。我设法让其中一个实例列出,但不是其他实例。了解运行对象表

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

下面是结果:

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} 

我希望看到多条线路与VisualStudio.DTE我在做什么错?我应该期待看到什么?

编辑:

这似乎与应用程序是否在运行提升权限。如果我保持一致并使用正常模式,那么它就可以工作。不过,我希望它能够工作,不管怎样,我如何获得所有进程的ROT?

+0

做工精细当我尝试它。 – 2012-08-06 21:24:00

+1

你在运行另一个实例吗?你运行这个EXE提升? – 2012-08-06 21:27:55

+0

@HansPassant你在结果中看到了什么? – 2012-08-06 21:38:42

回答

8

你在运行另一个实例吗?你运行的EXE提升?

当您是一个以标准用户身份运行的进程时,您只能看到属于您的进程/ etc。所以你不会看到以管理员身份运行的进程。

当使用升级的特权运行时,您可以看到属于所有用户的所有进程。

理想的情况下,一切都将始终运行的“最低特权用户”,看到http://en.wikipedia.org/wiki/Principle_of_least_privilege

+0

任何解释?预期GetRunningObjectTable对于不同特权的行为是什么? – 2012-08-06 22:18:03

+1

你希望它返回你永远不能使用的接口指针吗? – 2012-08-07 01:11:53

+0

尽管@HansPassant在他的精辟评论中非常明智,但更为翔实的答案可能涉及提及安全性和流程隔离,更具体地说,允许未升级的流程操纵升级的流程可能允许未升级的流程执行不允许的事情做。这被称为“特权升级”,是一件坏事。 – x0n 2017-11-20 20:14:44