了解运行对象表(Understanding the Running Object Table)

2019-06-26 19:27发布

我试图使用运行对象表得到一个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?

Answer 1:

您运行的另一个实例升高吗? 你运行的exe升高吗?

当你运行作为一个标准用户的过程,你只能看到属于你的进程/等。 所以你不会看到正在运行的管理员进程。

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

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



文章来源: Understanding the Running Object Table
标签: c# com interop