C# 理解运行对象表
我正试图使用running object表获取一个DTE,它是VisualStudio的一个特定实例。我打算使用上描述的技术。我已设法列出其中一个实例,但没有列出其他实例C# 理解运行对象表,c#,com,interop,C#,Com,Interop,我正试图使用running object表获取一个DTE,它是VisualStudio的一个特定实例。我打算使用上描述的技术。我已设法列出其中一个实例,但没有列出其他实例 public static void PrintRot() { IRunningObjectTable rot; IEnumMoniker enumMoniker; int retVal = GetRunningObjectTable(0, out rot); if (retVal == 0)
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可以看到多行内容我做错了什么?我应该期待看到什么
编辑:
这似乎与应用程序是否运行提升的权限有关。如果我是一致的,并使用正常模式,那么它的工作。然而,不管怎样,我都希望它能工作,我怎样才能得到所有进程的腐朽呢 您正在运行另一个实例吗?你在运行exe吗 当您是以标准用户身份运行的流程时,您只能看到属于您的流程/etc。因此,您不会看到以管理员身份运行的进程 在使用升级权限运行时,您可以看到属于所有用户的所有进程
理想情况下,一切都将始终以“最低特权用户”的身份运行,请参见您是否正在运行另一个实例?你在运行这个程序吗?@HansPassant你在结果中看到了什么?@JohnGardner我想可能是这样-我关闭了VS并以相同的方式打开了两个实例,它们出现了。有什么解释吗?对于不同的权限,GetRunningObjectTable的行为是什么?您希望它返回您永远无法使用的接口指针吗?尽管@HansPassant的评论非常精辟,但更具信息性的回答可能涉及到安全性和进程隔离,更具体地说,允许未提升的进程操纵提升的进程可能会允许未提升的进程做不允许做的事情。这被称为“特权升级”,是一件坏事。即使返回一个您永远无法使用的接口指针,也是另一件坏事(tm),“信息泄露”。只需知道一个特定命名的exe正在以管理员(或其他用户)的身份运行,就可以在攻击中发挥作用。