Пример #1
0
        /// <summary>
        /// 顯示對話框
        /// </summary>
        /// <param name="message"></param>
        /// <param name="title"></param>
        public static void ShowMessageBox(string message, string title)
        {
            int resp = 0;

            WinApi.WTSSendMessage(
                WTS_CURRENT_SERVER_HANDLE,
                WinApi.WTSGetActiveConsoleSessionId(),
                title, title.Length,
                message, message.Length,
                0, 0, out resp, false);
        }
Пример #2
0
        /// <summary>
        /// 以呼叫者的身份執行
        /// </summary>
        /// <param name="app"></param>
        /// <param name="path"></param>
        /// <param name="IsSilenceMode"></param>
        /// <returns></returns>
        public static string StartProcessAsLoader(string app, string path, bool IsSilenceMode = true)
        {
            bool   result;
            IntPtr hToken      = WindowsIdentity.GetCurrent().Token;
            IntPtr hDupedToken = IntPtr.Zero;

            var pi = new WinApi.PROCESS_INFORMATION();
            var sa = new WinApi.SECURITY_ATTRIBUTES();

            sa.Length = Marshal.SizeOf(sa);

            var si = new WinApi.STARTUPINFO();

            si.cb = Marshal.SizeOf(si);

            int dwSessionID = WinApi.WTSGetActiveConsoleSessionId();

            LOG.Debug("session id:" + dwSessionID);
            result = WinApi.WTSQueryUserToken(dwSessionID, out hToken);

            if (!result)
            {
                var error = "WTSQueryUserToken failed :" + Marshal.GetLastWin32Error();

                LOG.Error(error);
                if (!IsSilenceMode)
                {
                    WinApi.ShowMessageBox(error, "CreateProcess Error");
                }
            }

            var GENERIC_ALL_ACCESS = 0x10000000;

            result = WinApi.DuplicateTokenEx(
                hToken,
                GENERIC_ALL_ACCESS,
                ref sa,
                (int)WinApi.SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,
                (int)WinApi.TOKEN_TYPE.TokenPrimary,
                ref hDupedToken
                );

            if (!result)
            {
                var error = "DuplicateTokenEx failed :" + Marshal.GetLastWin32Error();

                LOG.Error(error);
                if (!IsSilenceMode)
                {
                    WinApi.ShowMessageBox(error, "CreateProcess Error");
                }
            }

            IntPtr lpEnvironment = IntPtr.Zero;

            result = WinApi.CreateEnvironmentBlock(out lpEnvironment, hDupedToken, false);

            if (!result)
            {
                var error = "CreateEnvironmentBlock failed :" + Marshal.GetLastWin32Error();

                LOG.Error(error);
                if (!IsSilenceMode)
                {
                    WinApi.ShowMessageBox(error, "CreateProcess Error");
                }
            }

            result = WinApi.CreateProcessAsUser(
                hDupedToken,
                app,
                String.Empty,
                ref sa, ref sa,
                false, 0, IntPtr.Zero,
                path, ref si, ref pi);

            var resultMessage = "";

            if (!result)
            {
                int error = Marshal.GetLastWin32Error();
                resultMessage = (error == 2) ?
                                "檔案名稱錯誤 (需用完整路徑名) CreateProcessAsUser : 2" :
                                String.Format("CreateProcessAsUser Error: {0}", error);

                //ShowMessageBox("檔案名稱錯誤 (需用完整路徑名)", "AlertService Message");
            }

            if (pi.hProcess != IntPtr.Zero)
            {
                WinApi.CloseHandle(pi.hProcess);
            }
            if (pi.hThread != IntPtr.Zero)
            {
                WinApi.CloseHandle(pi.hThread);
            }
            if (hDupedToken != IntPtr.Zero)
            {
                WinApi.CloseHandle(hDupedToken);
            }

            return(resultMessage);
        }