Как вы снимите привилегии для дочернего процесса

Я знаю, как запустить процесс с правами администратора из процесса, используя:

proc.StartInfo.UseShellExecute = true; proc.StartInfo.Verb = "runas"; 

где proc – System.Diagnostics.Process. Но как делать наоборот?

Если процесс, в котором вы находитесь, уже повышен, как вы запускаете новый процесс без прав администратора? Более точно, нам нужно запустить новый процесс с тем же уровнем разрешений, что и проводник Windows, поэтому никаких изменений, если UAC отключен, но если UAC включен, но наш процесс работает повышенным, нам необходимо выполнить определенную операцию un-elevated потому что мы создаем виртуальный диск, и если он создан с повышенными разрешениями, а проводник Windows работает без изменений, он не будет отображаться.

Не стесняйтесь менять заголовок на что-то лучшее, я не мог придумать хорошего описания.

Решение для вас – использовать EXPLORER.exe.

Идея состоит в том, чтобы запустить этот процесс в режиме UNLELEE, используя Windows Explorer explorer.exe ( info ). Допустим, что процесс, который мы хотим запустить, находится на $TEMP\MyUnElevatedProcess.exe .

Итак, для кода NSIS я просто напишу: (но может быть запущен на ЛЮБОЙ язык)

  Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"' 

Пример кода ( с помощью установщика NSIS )

 Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"' 

*** код, взятый из http://mdb-blog.blogspot.com/2013/01/nsis-lunch-program-as-user-from-uac.html

Мы закончили тем, что использовали образец из этой статьи проекта Code: высокая высота может быть плохой для вашего приложения: как начать не-поднятый процесс в конце установки

Кажется, что я работаю до сих пор, я понимаю, что он внедряет в RunDll32.exe, мой C ++ / Win32 довольно слаб, поэтому я не слишком сильно смотрел на реальную реализацию, просто ее использовали. Подтверждено, что он работает в Vista и Win7, как x86, так и x64 (по крайней мере для нас, x86 и x64 требуются разные dll, которые проверяются на время установки, и используется соответствующий).

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

 public static class UnelevatedProcessStarter { public static void Start(string cmdArgs) { // 1. Get the shell var shell = NativeMethods.GetShellWindow(); if (shell == IntPtr.Zero) { throw new Exception("Could not find shell window"); } // 2. Copy the access token of the process NativeMethods.GetWindowThreadProcessId(shell, out uint shellProcessId); var hShellProcess = NativeMethods.OpenProcess(0x00000400 /* QueryInformation */, false, (int)shellProcessId); if (!NativeMethods.OpenProcessToken(hShellProcess, 2 /* TOKEN_DUPLICATE */, out IntPtr hShellToken)) { throw new Win32Exception(); } // 3. Dublicate the acess token uint tokenAccess = 8 /*TOKEN_QUERY*/ | 1 /*TOKEN_ASSIGN_PRIMARY*/ | 2 /*TOKEN_DUPLICATE*/ | 0x80 /*TOKEN_ADJUST_DEFAULT*/ | 0x100 /*TOKEN_ADJUST_SESSIONID*/; var securityAttributes = new SecurityAttributes(); NativeMethods.DuplicateTokenEx( hShellToken, tokenAccess, ref securityAttributes, 2 /* SecurityImpersonation */, 1 /* TokenPrimary */, out IntPtr hToken); // 4. Create a new process with the copied token var si = new Startupinfo(); si.cb = Marshal.SizeOf(si); if (!NativeMethods.CreateProcessWithTokenW( hToken, 0x00000002 /* LogonNetcredentialsOnly */, null, cmdArgs, 0x00000010 /* CreateNewConsole */, IntPtr.Zero, null, ref si, out ProcessInformation _)) { throw new Win32Exception(); } } public class NativeMethods { [DllImport("user32.dll")] public static extern IntPtr GetShellWindow(); [DllImport("user32.dll", SetLastError = true)] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); [DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr OpenProcess(int processAccess, bool bInheritHandle, int processId); [DllImport("advapi32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool OpenProcessToken(IntPtr processHandle, UInt32 desiredAccess, out IntPtr tokenHandle); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool DuplicateTokenEx(IntPtr hExistingToken, uint dwDesiredAccess, ref SecurityAttributes lpTokenAttributes, int impersonationLevel, int tokenType, out IntPtr phNewToken); [DllImport("advapi32", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool CreateProcessWithTokenW( IntPtr hToken, int dwLogonFlags, string lpApplicationName, string lpCommandLine, int dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, [In] ref Startupinfo lpStartupInfo, out ProcessInformation lpProcessInformation); } [StructLayout(LayoutKind.Sequential)] public struct ProcessInformation { public IntPtr hProcess; public IntPtr hThread; public int dwProcessId; public int dwThreadId; } [StructLayout(LayoutKind.Sequential)] public struct SecurityAttributes { public int nLength; public IntPtr lpSecurityDescriptor; public int bInheritHandle; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct Startupinfo { public Int32 cb; public string lpReserved; public string lpDesktop; public string lpTitle; public Int32 dwX; public Int32 dwY; public Int32 dwXSize; public Int32 dwYSize; public Int32 dwXCountChars; public Int32 dwYCountChars; public Int32 dwFillAttribute; public Int32 dwFlags; public Int16 wShowWindow; public Int16 cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } } 

Вы можете использовать ProcessStartInfo.UserName и ProcessStartInfo.Password, чтобы указать учетную запись, с которой вы хотите работать.

 class Program { static void Main(string[] args) { var psi = new ProcessStartInfo(@"c:\windows\system32\whoami.exe"); var password = new SecureString(); password.AppendChar('s'); password.AppendChar('e'); password.AppendChar('c'); password.AppendChar('r'); password.AppendChar('e'); password.AppendChar('t'); psi.Password = password; psi.UserName = "username"; psi.UseShellExecute = false; psi.RedirectStandardOutput = true; var p = new Process(); p.StartInfo = psi; p.Start(); p.WaitForExit(); Console.WriteLine(p.StandardOutput.ReadToEnd()); } } 
  • Скрыть учетную запись с экрана входа, но можно использовать в UAC
  • Ctrl + Shift + Enter для «Запуск от имени администратора» работает в программах «Desktop app», но не в программах «Run command»
  • Запустить повышенную командную строку в% UserProfile% по умолчанию?
  • Как заставить любую программу работать без полномочий администратора в Windows 7?
  • Скрипт Powershell с повышенными разрешениями по-прежнему не имеет достаточных разрешений
  • Есть ли диалоговое окно «Запуск» Windows в качестве администратора?
  • Можно ли использовать учетную запись администратора для повседневного использования, если UAC включен?
  • Как я могу получить приглашение UAC / elevation для запоминания моего локального имени пользователя?
  • Delphi: запрашивать повышение UAC при необходимости
  • Windows 7 отключает UAC с непринятой учетной записи
  • Запуск приложений как администратора по умолчанию в Windows 10
  • Interesting Posts

    Любой способ получить ограничительную рамку из объекта three.js Object3D?

    Разница между пользователем Power и Администратором

    Исключение точки останова в Xcode

    OpenMP set_num_threads () не работает

    Как сделать голосовой ответ VirtualBox на порт rdp?

    Почему автоинкремент MySQL увеличивается при неудачных вставках?

    Почему этот цикл создает «предупреждение: итерация 3u вызывает неопределенное поведение» и выводит более 4 строк?

    Возможно ли включить ведение журнала или какой-либо режим отладки для Office Deployment Tool?

    Как увеличить разрешение экрана с 1024×600 до 1024×768 на HP Mini 210-4128er?

    Как проверить доступ в Интернет на Android? InetAddress никогда не выбегает

    Regex для IP-адреса

    Почему java-приложение врезается в gdb, но работает нормально в реальной жизни?

    Почему 3G-маршрутизатор не выполняет переадресацию портов на интерфейсе 3G?

    Различия между страtagsями GeneratedValue

    Powershell send-mailmessage – электронная почта для нескольких получателей

    Давайте будем гением компьютера.