了解运行对象表
Posted
技术标签:
【中文标题】了解运行对象表【英文标题】:Understanding the Running Object Table 【发布时间】:2012-08-03 20:34:15 【问题描述】:我正在尝试使用正在运行的对象表来获取 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?
【问题讨论】:
您是否正在运行另一个提升的实例?你运行这个 exe 提升了吗? @HansPassant 您在结果中看到了什么? @JohnGardner 我想可能是这样 - 我关闭了 VS 并以相同的方式打开了两个实例,它们出现了。 【参考方案1】:您是否正在运行另一个提升的实例?你在运行提升的 exe 吗?
当您是作为标准用户运行的进程时,您只能看到属于您的进程/等。所以你不会看到以管理员身份运行的进程。
当以提升的权限运行时,您可以看到属于所有用户的所有进程。
理想情况下,一切都将始终作为“最低权限用户”运行,请参阅http://en.wikipedia.org/wiki/Principle_of_least_privilege
【讨论】:
有什么解释吗? GetRunningObjectTable 对于不同权限的预期行为是什么? 您是否希望它返回您永远无法使用的接口指针? 虽然@HansPassant 对他的精辟评论非常明智,但更多信息的答案可能涉及安全性和进程隔离的提及,更具体地说,允许未提升的进程操作提升的进程可能允许未提升的进程做不允许做的事情。这被称为“特权升级”,是一件坏事。 即使返回一个你永远无法使用的接口指针也将是另一个坏事(tm),“信息泄露”。只需知道特定命名的 exe 以管理员(或其他用户)身份运行就可以在攻击中发挥作用。以上是关于了解运行对象表的主要内容,如果未能解决你的问题,请参考以下文章