9

実行中のオブジェクト テーブルを使用して、Visual Studio の特定のインスタンスである DTE を取得しようとしています。MSDNで説明されている手法を使用するつもりでした。インスタンスの 1 つを一覧表示できましたが、他のインスタンスは取得できませんでした。

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を取得するにはどうすればよいですか?

4

1 に答える 1

10

昇格した別のインスタンスを実行していますか? 昇格したexeを実行していますか?

あなたが標準ユーザーとして実行されているプロセスである場合、あなたに属するプロセス/etcのみを見ることができます。したがって、管理者として実行されているプロセスは表示されません。

エスカレートされた権限で実行すると、すべてのユーザーに属するすべてのプロセスが表示されます。

理想的には、すべてが常に「最小特権ユーザー」として実行されます。http://en.wikipedia.org/wiki/Principle_of_least_privilegeを参照してください。

于 2012-08-06T21:52:51.150 に答える