Вопрос по com, interop, c# – Понимание таблицы бегущих объектов

6

Я пытаюсь использовать таблицу запущенных объектов для получения 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 Что я делаю не так? Что я должен ожидать увидеть?

Edit:

Кажется, это связано с тем, работает ли приложение с повышенными привилегиями. Если я согласен и использую обычный режим, тогда он работает. Однако мне бы хотелось, чтобы он работал независимо от того, как мне получить ROT для всех процессов?

у вас запущен другой экземпляр с повышенными правами? ты убегаешь этот exe повышен? John Gardner
@JohnGardner Я думаю, что это могло быть - я закрыл VS и открыл два экземпляра одинаково, и они появились. Dave Hillier
добавил как ответ то :) John Gardner
Работает нормально, когда я пытаюсь. Hans Passant
@HansPassant, что ты видишь в своих результатах? Dave Hillier

Ваш Ответ

1   ответ
9

у вас запущен другой экземпляр с повышенными правами? ты запускаешь exe с повышенными правами?

Когда вы работаете как обычный пользователь, вы можете видеть только те процессы и т. Д., Которые принадлежат вам. Таким образом, вы не увидите процессы, выполняющиеся от имени администратора.

При работе с повышенными привилегиями вы можете видеть все процессы, принадлежащие всем пользователям.

В идеале все должно работать как «наименее привилегированный пользователь», см.http://en.wikipedia.org/wiki/Principle_of_least_privilege

Вы бы предпочли, чтобы он возвращал указатели интерфейса, которые вы никогда не сможете использовать?
Хотя @HansPassant весьма мудр в своем содержательном комментарии, более информативный ответ может включать упоминание о безопасности и изоляции процессов, в частности, разрешение неуровневому процессу манипулировать повышенным процессом может позволить неуровневому процессу делать то, что ему запрещено. сделать. Это называется "повышение привилегий", quot; и это плохо.
Любое объяснение? Как ожидается поведение GetRunningObjectTable для разных привилегий? Dave Hillier
даже возвращение указателя интерфейса, который вы никогда не сможете использовать, было бы еще одной ошибкой, «раскрытием информации». простоknowing что специально названный exe-файл работает от имени администратора (или от имени другого пользователя), может быть полезен при атаке.

Похожие вопросы