C# Process.Start()未在同一用户下生成新进程

C# Process.Start()未在同一用户下生成新进程,c#,security,credentials,process.start,context-switch,C#,Security,Credentials,Process.start,Context Switch,我一直认为,当您以(domain\user)mydomain\myuser的身份运行进程时,当使用process.Start()时,它将使用相同的凭据启动此新进程-mydomain\myuser 我遇到的问题是,我的Process.Start()调用似乎正在系统帐户下创建一个进程,这导致我在已启动的进程中出现权限问题(由于它所做的工作,必须在管理员帐户下运行)。如果它改变了一些事情-我将从windows安装程序中的生成此进程(自定义生成的exe) 有什么建议吗?我已经读过关于windows组策略

我一直认为,当您以
(domain\user)mydomain\myuser
的身份运行进程时,当使用
process.Start()
时,它将使用相同的凭据启动此新进程-
mydomain\myuser

我遇到的问题是,我的
Process.Start()
调用似乎正在系统帐户下创建一个进程,这导致我在已启动的进程中出现权限问题(由于它所做的工作,必须在管理员帐户下运行)。如果它改变了一些事情-我将从windows安装程序中的生成此进程(自定义生成的exe)

有什么建议吗?我已经读过关于windows组策略(可能)对此有影响的文章,但如果我诚实的话,我对此一无所知

编辑:一个小片段:

其中
exename
commandLine
是此方法主体的参数:

ProcessStartInfo procInfo = new ProcessStartInfo(exeName, commandLine);
procInfo.WorkingDirectory = workingDirectory;
procInfo.UseShellExecute = false;
procInfo.CreateNoWindow = true;
Process process = Process.Start(procInfo);
Process.WaitForExit();
return process.ExitCode;

你的印象是真实的。Process.Start()将始终在当前用户的凭据下启动新进程-除非您在
ProcessStartInfo
中提供替代凭据或使用获取凭据的重载之一

肯定还有另一个问题-共享代码片段

更新


好的!你们并没有提到任何关于安装程序的事情。所有MSI安装程序都将在系统下运行,因为它们将由“Windows Installer”运行,您可以检查它们,并且它们将在系统下运行。您的印象是正确的。Process.Start()将始终在当前用户的凭据下启动新进程-除非您在
ProcessStartInfo
中提供替代凭据或使用获取凭据的重载之一

肯定还有另一个问题-共享代码片段

更新


好的!你们并没有提到任何关于安装程序的事情。所有MSI安装程序都将在系统下运行,因为它们将由“Windows Installer”运行,您可以检查它们,并在system

下运行,或者将procInfo.UseShellExecute设置为true,或者将cmd作为进程执行,并将exe作为cmd命令的参数。当UseShellExecute设置为false时,有很多有趣的副作用:

将procInfo.UseShellExecute设置为true,或者将cmd作为进程执行,将exe作为cmd命令的参数。当UseShellExecute设置为false时,有很多有趣的副作用:

我已经从我的方法中添加了一个片段来启动进程,但这并没有什么特别之处(而且我还没有参数化任何凭据)。感谢到目前为止的输入,我很想听听您的其他想法。项目的部分内容是基于web的,但安装程序和exe只是常规的.Net代码。我(在进行任何编辑之前)非常清楚地说:“在windows安装程序中。”。最重要的是,setup.exe/MSI可以在任何帐户下运行。所以我一定错过了这一点-这是您想要强调的内容。我看到你已经收回了你的10分,这很好,但正如我再次说过的,MSI安装程序服务总是运行MSI安装程序的一部分。您可以使用各种工具来验证这一点,包括process explorer,其中您的进程显示在msiexec.exe下,并且无论何时运行安装程序,您都会看到msiexec.exe进程oi已启动,完成后,它将消失。我已从方法中添加了一个片段来启动该进程,但这并没有什么特别之处(我还没有参数化任何凭据)。感谢您迄今为止的输入,我很想听听您的其他想法。该项目的部分内容是基于web的,但安装程序和exe只是常规的.Net代码。我(在进行任何编辑之前)非常清楚地说:“在windows安装程序中。”。最重要的是,setup.exe/MSI可以在任何帐户下运行。所以我一定错过了这一点-这是您想要强调的。我看到您已经收回了您的10点,这很好,但正如我再次说过的,安装程序的MSI部分始终由MSI安装程序服务运行。您可以使用包括process explorer在内的各种工具验证这一点re您的进程显示在msiexec.exe下,并且每当您运行安装程序时,您都会看到msiexec.exe进程oi启动,完成后,它消失。您确定原始代码没有作为
系统运行吗?是的,100%确定。我通过两种方式检查了此问题-一种是使用我们生成的setup exe(并通过任务管理器确保运行它的用户是我)。此外,通过运行我们生成的MSI,在命令提示符下使用msiexec,并强制它以我的用户名下的管理权限运行。一旦进程启动()exe已启动,这表明在这两种情况下都是由“系统”运行的。您确定原始代码没有作为
SYSTEM
运行吗?是的,100%确定。我已通过两种方式对此进行了检查—一种是使用我们生成的setup exe(并通过任务管理器确保它运行的用户是我)。也可以通过运行我们生成的MSI,在命令提示符下使用msiexec,并强制它以我的用户名下的管理权限运行。一旦进程启动()exe已启动,这表明在这两种情况下都是由“系统”运行的。我会尝试一下CMD idea,然后再联系,谢谢你的建议。我也遇到了这个问题。我已经用我的exe作为参数调用了
CMD
,如果我想记录错误的话(通过使用
RedirectStandardError
,我无法将
UseShellExecute
设置为
true
。我该怎么办?我会尝试一下CMD的想法,然后再联系,谢谢你的建议。我也遇到了这个问题。我已经在调用
CMD
,并将exe作为参数,如果我想在全部(通过使用
RedirectStandardError
,我无法将
UseShellExecute
设置为
true
。从那里我该怎么办?