Как я могу получить свой Windows сервис для просмотра объектов в ROT? - PullRequest
1 голос
/ 05 января 2020

РЕДАКТИРОВАТЬ: Несмотря на тангенциальную связь, помеченный «дубликат» не является истинной копией этого вопроса и, что более важно, не отвечает на этот вопрос (потому что проблема в другом). Я работаю со службой Windows, а не с автономным приложением для пользовательского пространства.

Вот то, с чем я работаю:

Я написал службу Windows (работает в Windows Сервер 2019) в C#, который взаимодействует с другим программным обеспечением через COM. Это другое программное обеспечение не является программным обеспечением, к которому у меня есть доступ к источнику, поэтому я не могу вносить изменения в флаги регистрации COM или что-то подобное, но оно регистрируется само по себе и имеет API.

Мне бы хотелось использовать рабочую таблицу объектов (ROT) из моего сервиса для получения экземпляра другого программного обеспечения через отображаемое имя моникера, однако ROT всегда пуст с точки зрения моего сервиса, даже после того, как сервис сам запускает экземпляр другого программного обеспечения через Process.Start (), которая возвращает действительный PID. Чтобы было понятно, это работает нормально из автономной Windows консоли или приложения Windows, но не как служба.

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

Вот пример кода. При запуске в консольном приложении он подсчитывает много имен, при запуске в моем сервисе счетчик всегда равен 0 даже после запуска процесса.

    [DllImport("ole32.dll")]
    private static extern int CreateBindCtx(uint reserved, out IBindCtx ppbc);
    private static void TestRot()
    {
        IBindCtx context = null;
        IRunningObjectTable rot = null;
        IEnumMoniker monikers = null;
        log.Debug("About to start moniker check");

        CreateBindCtx(0, out context);
        context.GetRunningObjectTable(out rot);
        rot.EnumRunning(out monikers);
        var moniker = new IMoniker[1];

        log.Debug("Beginning moniker loop");
        var counter = 0;

        while (monikers.Next(1, moniker, IntPtr.Zero) == 0)
        {
            counter++;
            var curMoniker = moniker.First();
            string name = null;
            if (curMoniker != null)
            {
                try
                {
                    curMoniker.GetDisplayName(context, null, out name);
                }
                catch (UnauthorizedAccessException)
                {
                    log.Debug($"UnauthorizedAccessException when getting display name for curMoniker");
                }
            }
            log.Debug($"curMoniker: {name}");

        }
        log.Debug("Counted monikers: " + counter);
    }

Заранее спасибо.

...