【问题标题】:Executing msbuild process through code gets exit code -1073741502通过代码执行msbuild进程得到退出码-1073741502
【发布时间】:2015-03-17 04:54:43
【问题描述】:

我的应用程序正在使用 Process.Start(); 作为另一个用户运行 MsBuild.exe。该进程作为服务运行。当执行过程立即失败并返回错误代码-1073741502

  • 我正在将我的代码作为服务执行。
  • 无论我授予什么用户或权限,都会发生这种情况(即使作为管理员)。
  • 服务用户同时拥有Run as a serviceImpersonate another user 的本地安全策略
  • 无论如何我的日志记录方法都不会被调用。这是否意味着它甚至在开始之前就失败了?
  • 其他可执行文件以这种方式执行没有问题。
  • 当我的代码不作为服务执行时,它会成功执行。
  • WTF 是负错误代码1073741502??(!!) 我找到的最接近的是this

示例代码:

void Main(){
    var startInfo = new ProcessStartInfo
    {
        FileName = path,
        Arguments = args,
        WorkingDirectory = workingPath,
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        LoadUserProfile = true,
        Domain = System.Environment.MachineName,
        UserName = creds.Username,
        Password = generateSecureString(creds.Password)
    };
    var process = Process.Start(startInfo);
    process.OutputDataReceived += process_OutputDataReceived;
    process.ErrorDataReceived += process_OutputDataReceived;
    process.Exited += process_Exited;
    process.EnableRaisingEvents = true;
    process.WaitForExit();
}

internal void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    Console.WriteLine(e.Data);
}

void process_Exited(object sender, EventArgs e)
{
    var process = ((Process) sender);
    Console.WriteLine("Process has finished execution, exit code '{0}'.", process.ExitCode);
}

private SecureString generateSecureString(string password)
{
    var secure = new SecureString();
    foreach (var c in password.ToCharArray())
    {
        secure.AppendChar(c);
    }
    return secure;
}

任何帮助将不胜感激。似乎是权限/本地安全策略问题,但在不了解更多信息的情况下,感觉就像我已经达到了我的故障排除的“精神错乱的定义”点,我只是重复相同的操作,期待不同的结果。

在调查事件日志时,我看到以下异常(含糊不清):

Faulting application name: msbuild.exe, version: 12.0.31101.0, time stamp: 0x545443d5
Faulting module name: KERNELBASE.dll, version: 6.3.9600.17668, time stamp: 0x54c846bb
Exception code: 0xc0000142
Fault offset: 0x0009e052 
Faulting process id: 0x3e8
Faulting application start time: 0x01d065cdac34cc77
Faulting application path: C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe
Faulting module path: KERNELBASE.dll
Report Id: ecce8b9d-d1c0-11e4-80d7-00155d611ee6
Faulting package full name: 
Faulting package-relative application ID:

【问题讨论】:

  • 错误代码为 0xC0000142 == STATUS_DLL_INIT_FAILED。检查事件日志 (eventvwr.msc) 以获取有关无法初始化的特定 DLL 的任何其他详细信息。
  • 带有 ProcessName = msbuild.exe 过滤器的 ProcMon 也可能会有所帮助,如果您还没有考虑过的话。
  • 三件事:1)通过设置startInfo.LoadUserProfile = true加载用户配置单元; 2) 确保您正在启动进程的工作目录具有 ACL 以允许访问用户帐户; 3) 确保您的服务在不同于 LocalSystem 的帐户下执行 - SystemService 可以工作,任何自定义用户也可以。
  • @S.T.可以使用LoadUserProfile=true 确认可以确认用户拥有Modify 权限并且该服务作为Administrators 的成员的新帐户运行。
  • 开始怀疑这是否是一个新的 .Net 4.5 安全要求,它阻止服务模拟进程的执行stackoverflow.com/a/15688675/115749

标签: c# msbuild


【解决方案1】:

根据此线程 (Why is this process crashing as soon as it is launched?),从服务启动进程可能会导致本机 CreateProcessWithLogonW API 调用似乎无法从服务工作。 我刚刚找到了这个线程,因为我认为我面临着类似的问题,但是 powershell start-process commandlet 在服务中运行(它可能在内部使用CreateProcessWithLogonW

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-19
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多