Вызов CreateProcessAsUser от C#

Из ACR pov это поддерживается. Скажем, вы создаете компонент Service SP1 в tenant1 / sub1 и назначаете ему роль AcrPull для registry1 в tenant1 / sub1. SP1 теперь может получить доступ к Registry1. Затем вы можете назначить тому же SP1 роль AcrPull для registry2 в другом tenant tenant2 / sub2 (это, по сути, делает SP1 основным гостевым сервисом в tenant2); теперь SP1 также можно вытащить из реестра2. Пока SP получает разрешение на извлечение из реестра, вы можете использовать SP как user / pwd для доступа к реестру из любого места. Можете ли вы рассказать, что не работает?

9
задан Martin 9 March 2010 в 00:35
поделиться

3 ответа

Ahh... кажется liker, я ловился одним из самых больших глюков в программировании WinAPI interop. Кроме того, Регистрация кода для моих объявлений функции была бы мудрой идеей в этом случае.

Так или иначе все, что я должен был сделать, было, добавляет аргумент атрибуту DllImport функционального определения CharSet = CharSet.Unicode. Это добилось цели для обоих CreateProcessWithLogonW и CreateProcessWithTokenW функции. Я предполагаю, что это наконец просто поразило меня, что суффикс W имен функций упомянул Unicode и что я должен был явно указать это в C#! Вот корректные объявления функции в случае, если любому интересно:

[DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool CreateProcessWithLogonW(string principal, string authority,
    string password, LogonFlags logonFlags, string appName, string cmdLine,
    CreationFlags creationFlags, IntPtr environmentBlock, string currentDirectory,
    ref STARTUPINFO startupInfo, out PROCESS_INFORMATION processInfo);

[DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool CreateProcessWithTokenW(IntPtr hToken, LogonFlags dwLogonFlags,
    string lpApplicationName, string lpCommandLine, CreationFlags dwCreationFlags,
    IntPtr lpEnvironment, string lpCurrentDirectory, [In] ref STARTUPINFO lpStartupInfo,
    out PROCESS_INFORMATION lpProcessInformation);
7
ответ дан 4 December 2019 в 12:21
поделиться

Отсюда:

Как правило, процесс, который вызывает функцию CreateProcessAsUser, должен иметь SE_ASSIGNPRIMARYTOKEN_NAME и полномочия SE_INCREASE_QUOTA_NAME. Если эта функция сбои с ERROR_PRIVILEGE_NOT_HELD (1314), используйте функцию CreateProcessWithLogonW вместо этого. CreateProcessWithLogonW не требует никаких специальных полномочий, но указанной учетной записи пользователя нужно позволить войти в систему в интерактивном режиме. Обычно лучше использовать CreateProcessWithLogonW для создания процесса с альтернативными учетными данными.

Посмотрите это сообщение в блоге, Как назвать CreateProcessWithLogonW & CreateProcessAsUser в.NET

6
ответ дан 4 December 2019 в 12:21
поделиться

Джонатан Пепперс предоставил этот отличный код, который исправил мои проблемы

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/0c0ca087-5e7b-4046-93cb-c7b3e48d0dfb?ppud=4

4
ответ дан 4 December 2019 в 12:21
поделиться
Другие вопросы по тегам:

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