У меня есть приложение с декларацией, которая требует выполнения как администратора, но часть приложения должна подключить диск с помощью 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();
}
}
Править
Если у текущего пользователя есть административные привилегии затем, основной процесс поднят с декларацией в коде, который поднят, я хочу выполнить команду в пользователях неподнятое пространство, поскольку это, кажется, имеет различные переменные среды и т.д. Я верю, после того как поток запускается это само изменение наклона, это должно выполнить новый.
Я не уверен, что это способ сделать это без создания нового процесса, ImpersonateLoggedOnUser будет работать только из службы, и я не хочу предоставлять учетные данные.
поправьте меня, если я ошибаюсь
посмотрите статью Небольшой класс C# для выдачи себя за пользователя проекта кода. В нем реализован класс IDisposable (который освобождает токен аутентификации после его использования). Я видел утечки кода .NET из-за того, что токены имперсонализации не освобождаются.
Вы можете выдать себя за пользователя только для блока кода, который будет обращаться к сетевому ресурсу, к которому вам нужно получить доступ как другому пользователю. Ваш код будет выглядеть так
using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
{
/* code that executes under the new context */
...
}
Надеюсь, это поможет.
Сначала вам нужно получить токен пользователя, с которого вы хотите запустить приложение, вы можете сделать это с помощью WTSQueryUserToken . Если пользователь еще не вошел в систему, вы можете использовать LogonUser Win32 API для получения нового в новом сеансе. Чтобы получить все сеансы на вашем компьютере, вы можете использовать WTSEnumerateSessions .
Затем, получив токен, вы можете использовать CreateProcessAsUser или ImpersonateLoggedOnUser Win32 API.
Обязательно вызывайте CloseHandle
для получаемых вами дескрипторов, они особенно опасны для таких работ.