Запуск COM-компонента в .NET под другой учетной записью - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть COM-компонент, который я вызываю из службы Windows .NET, которая работает как локальная система. Эта служба вызывает компонент COM, который затем запускается под учетной записью SYSTEM. Во время отладки я пытаюсь проверить работу компонента COM под разными учетными записями пользователей. Я использую олицетворение, чтобы сделать это, и я использовал тот же код для успешного выполнения других задач. Однако попытка сделать то же самое для загрузки компонента COM под другой учетной записью не работает. Он все еще загружается как системная учетная запись.

Существует ли другая процедура для этого с COM-компонентами, загружаемыми с COM Interop?

Код всего лишь:

var identity = Impersonate.GetIdentity(Username, Domain, Password);
identity.Impersonate();
MyLib.Component com = new MyLib.Component();

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Я бы попытался использовать необработанный метод LogonUser, как показано в документации WindowsIdentity.Impersonate .

В основном войдите в систему как пользователь, а затем пользователь этого токена, чтобы выдать себя за этого пользователя:

bool returnValue = LogonUser(userName, domainName, password,
            LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
            out safeTokenHandle);

using (WindowsImpersonationContext impersonatedUser = 
         WindowsIdentity.Impersonate(userToken)
{
    Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);

    MyLib.Component com = new MyLib.Component();
}

Выше приведен упрощенный некомпилируемый фрагмент, основанный на коде MSDN для демонстрации общего подхода.

Плохая часть заключается в том, что пароль должен быть предоставлен LogonUserспособ.

0 голосов
/ 08 сентября 2011

COM + (Панель управления AKA / Инструменты администратора / Службы компонентов) - ваш друг.Создайте новый пакет, добавьте в него свой компонент, настройте любого пользователя для этого пакета.Потребители даже не заметят разницы.

Компонент будет работать вне процесса, разумеется, поэтому некоторые его аспекты могут нарушиться в теории (например, передача специфичных для процесса дескрипторов в качестве параметров).Но в сценариях взаимодействия это довольно редко.

Кроме того, вы можете отлаживать компонент отдельно от службы вызова.

...