Example #1
0
        public static Process RunAsCurrentUser(string fileName)
        {
            var _token = ImpersonationUtils._GetPrimaryToken();

            try {
                for (var _env = IntPtr.Zero; Win32.CreateEnvironmentBlock(ref _env, _token, false) && _env != IntPtr.Zero;)
                {
                    try {
                        IntPtr _hStdIn, _hStdOut, _hStdError;
                        var    _result = ImpersonationUtils._LaunchProcessAsUser(fileName, _token, _env, out _hStdIn, out _hStdOut, out _hStdError);

                        var _type = typeof(Process);
                        for (var _field = _type.GetField("standardInput", BindingFlags.Instance | BindingFlags.NonPublic); _field != null && _hStdIn != IntPtr.Zero && _hStdIn != new IntPtr(-1);)
                        {
                            _field.SetValue(_result, new StreamWriter(new FileStream(new SafeFileHandle(_hStdIn, true), FileAccess.Write), Encoding.GetEncoding(866))
                            {
                                AutoFlush = true
                            });
                            break;
                        }
                        for (var _field = _type.GetField("standardOutput", BindingFlags.Instance | BindingFlags.NonPublic); _field != null && _hStdOut != IntPtr.Zero && _hStdOut != new IntPtr(-1);)
                        {
                            _field.SetValue(_result, new StreamReader(new FileStream(new SafeFileHandle(_hStdOut, true), FileAccess.Read), Encoding.GetEncoding(866), true));
                            break;
                        }
                        for (var _field = _type.GetField("standardError", BindingFlags.Instance | BindingFlags.NonPublic); _field != null && _hStdError != IntPtr.Zero && _hStdError != new IntPtr(-1);)
                        {
                            _field.SetValue(_result, new StreamReader(new FileStream(new SafeFileHandle(_hStdError, true), FileAccess.Read), Encoding.GetEncoding(866), true));
                            break;
                        }
                        return(_result);
                    } finally {
                        Win32.DestroyEnvironmentBlock(_env);
                    }
                }
                throw new Win32Exception(Marshal.GetLastWin32Error(), "CreateEnvironmentBlock failed.");
            } finally {
                Win32.CloseHandle(_token);
            }
        }
Example #2
0
 public static IDisposable ImpersonateCurrentUser()
 {
     return(new WindowsIdentity(ImpersonationUtils._GetPrimaryToken()).Impersonate());
 }