Как я могу заставить мою службу Windows видеть объекты в ROT?
РЕДАКТИРОВАТЬ: хотя и косвенно связанный, помеченный "дубликат" не является истинным дубликатом этого вопроса и, что более важно, не отвечает на этот вопрос (потому что проблема в другом). Я работаю с оконной службой, а не с отдельным приложением в пользовательском пространстве.
Вот с чем я работаю:
Я написал службу Windows (работающую в Windows Server 2019) на C#, которая взаимодействует с другим программным обеспечением через COM. Это другое программное обеспечение не является программным обеспечением, для которого у меня есть доступ к источнику, поэтому я не могу вносить изменения в флаги регистрации COM или что-либо подобное, но оно регистрируется и имеет API.
Я хотел бы использовать текущую таблицу объектов (ROT) из моей службы, чтобы получить экземпляр другого программного обеспечения через отображаемое имя моникера, однако ROT всегда пуст с точки зрения моей службы, даже после того, как сама служба запускает экземпляр другого программного обеспечения через Process.Start(), который возвращает действительный PID. Чтобы было ясно, это отлично работает из отдельной консоли Windows или приложения Windows Form, но не как служба.
Служба настроена для входа в систему как пользователь, входящий в группу администраторов на этом компьютере. Почему он ничего не видит в 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);
}
Заранее спасибо.