以pipe理员身份从C#中的标准帐户运行batch file

我正在开发一个应用程序,需要从普通的个人帐户运行具有pipe理员权限的batch file。 当我login到计算机pipe理员帐户但没有pipe理员权限的“testing帐户”时,这一切都正常工作。 我确实从我的App.config文件中获取了所有需要的信息来login到pipe理员帐户。

我的第一个尝试是使用StartInfo作为angular色用户(pipe理员用户)运行此进程。 但是,如果我运行的过程

p.StartInfo.Verb = "runas"; 

那么我需要设置

 p.StartInfo.UseShellExecute = true; 

对于runas工作是正确的。 但如果我这样做,我得到这个例外:

 System.InvalidOperationException: The Process object must have the UseShellExecute property set to false in order to start a process as a user. 

我将UseShellExecute更改为false,但之后无法使用“runas”运行它,并启动没有pipe理员权限的进程。 如果UseShellExecute的值设置为true,则runas才起作用。

此解决scheme的代码:

 string domain = config.AppSettings.Settings["domain"].Value; string user = config.AppSettings.Settings["user"].Value; string password = config.AppSettings.Settings["password"].Value; try { Process p = new Process(); p.StartInfo.FileName = installationPath; p.StartInfo.Verb = "runas"; System.Security.SecureString ssPwd = new System.Security.SecureString(); for (int x = 0; x < password.Length; x++) { ssPwd.AppendChar(password[x]); } p.StartInfo.UseShellExecute = false; p.StartInfo.UserName = user; p.StartInfo.Password = ssPwd; p.Start(); cmdRun.Enabled = false; p.WaitForExit(); } catch (Exception exc) { Debug.WriteLine(exc); } 

我的第二个select是使用模拟。 我以pipe理员用户的身份login代码,然后运行该进程。 这一切都运行良好login,我试图打印WindowsIdentity.CurrentUser(),它显示了计算机pipe理员用户的名称。 这意味着模仿的作品。 但是,当我运行与UseShellExecute代码为true(必要运行“runas”)我得到这个exception:

 A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll System.ComponentModel.Win32Exception: Unknown error (0xfffffffe) at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo) at System.Diagnostics.Process.Start() 

如果我使用UseShellExecute作为false运行它,没有任何反应,也不会出现exception,但也不会有任何安装。 因为它不能使用UseShellExecute runas作为false。

此解决scheme的代码:

 string domain = config.AppSettings.Settings["domain"].Value; string user = config.AppSettings.Settings["user"].Value; string password = config.AppSettings.Settings["password"].Value; using (new Impersonation(domain, user, password)) { try { Process p = new Process(); p.StartInfo.FileName = installationPath; p.StartInfo.Verb = "runas"; p.StartInfo.UseShellExecute = true; p.Start(); cmdRun.Enabled = false; p.WaitForExit(); } catch (Exception exc) { Debug.WriteLine(exc); } } 

我想要的只是以pipe理员身份运行batch file,最好也禁用UAC。 只是为用户安装一个顺利。 我怎样才能做到这一点?

我“欺骗”UAC的方式是创建批处理文件,并创建一个计划任务,以最高的特权运行(没有活动计划)。然后,您可以从另一个批处理文件运行计划任务 – 从而完全避免UAC。

只会找到一个例子,并更新

编辑:我找不到我正在使用的示例,但这里是一个链接,描述技术http://www.techrepublic.com/blog/windows-and-office/run-uac-restricted-programs-without-所述-UAC提示符/

编辑两个:在我的情况下,我用它启动计算机后,使用VBScript,启动TeamViewer,但程序应该是相同的:我创建一个计划任务与“最高权限运行”称为TeamViewStartDelayedUAC文件夹UACWhiteList,然后我运行命令

 runLine = "C:\Windows\System32\schtasks.exe /RUN /TN ""UACWhitelis\TeamViewStartDelayedUAC""" DIM MyShell Set MyShell = CreateObject("WScript.Shell") MyShell.Run runLine,1,false