Выполните код в другом пользовательском контексте

У меня есть приложение с декларацией, которая требует выполнения как администратора, но часть приложения должна подключить диск с помощью WNetAddConnection2, которому я верю, требует, чтобы это было выполнено в контексте обычного пользователя из-за учетных данных и т.д. Есть ли способ выполнить этот бит кода в контексте обычного пользователя, не создавая отдельный процесс.

Править

Из комментариев я имею настолько далеко, но это не работает. Я ожидал это не к тому, поскольку я действительно не понимаю вполне, как я должен использовать это. Возможно, это лучше всего, если я открываю новый вопрос?

class Program
{
    [DllImport("advapi32.DLL")]
    public static extern bool ImpersonateLoggedOnUser(IntPtr hToken);
    [DllImport("advapi32.DLL")]
    public static extern bool RevertToSelf();

    static void Main(string[] args)
    {
        IntPtr phToken = IntPtr.Zero;
        ImpersonateLoggedOnUser(phToken);
        MapDrives();
        RevertToSelf();
    }
}

Править

Если у текущего пользователя есть административные привилегии затем, основной процесс поднят с декларацией в коде, который поднят, я хочу выполнить команду в пользователях неподнятое пространство, поскольку это, кажется, имеет различные переменные среды и т.д. Я верю, после того как поток запускается это само изменение наклона, это должно выполнить новый.

8
задан Charles Gargent 11 June 2010 в 16:01
поделиться

3 ответа

Я не уверен, что это способ сделать это без создания нового процесса, ImpersonateLoggedOnUser будет работать только из службы, и я не хочу предоставлять учетные данные.

поправьте меня, если я ошибаюсь

0
ответ дан 5 December 2019 в 23:13
поделиться

посмотрите статью Небольшой класс C# для выдачи себя за пользователя проекта кода. В нем реализован класс IDisposable (который освобождает токен аутентификации после его использования). Я видел утечки кода .NET из-за того, что токены имперсонализации не освобождаются.

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

using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
{
   /* code that executes under the new context */
   ...
}

Надеюсь, это поможет.

4
ответ дан 5 December 2019 в 23:13
поделиться

Сначала вам нужно получить токен пользователя, с которого вы хотите запустить приложение, вы можете сделать это с помощью WTSQueryUserToken . Если пользователь еще не вошел в систему, вы можете использовать LogonUser Win32 API для получения нового в новом сеансе. Чтобы получить все сеансы на вашем компьютере, вы можете использовать WTSEnumerateSessions .

Затем, получив токен, вы можете использовать CreateProcessAsUser или ImpersonateLoggedOnUser Win32 API.

Обязательно вызывайте CloseHandle для получаемых вами дескрипторов, они особенно опасны для таких работ.

1
ответ дан 5 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

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