以不同的用户方式启动InstallShield可执行文件时抛出STATUS_DLL_INIT_FAILED

时间:2018-02-01 14:03:40

标签: c#

我为几个安装程序编写了一个包装器来部署和记录软件包的输出。我在实际调用可执行文件时遇到了一个问题,它让我很难过!

在上一个版本中,我们使用本地系统帐户运行安装程序和可执行文件而没有问题 - 因为这次配置了InstallShield可执行文件的方式(读取:很差 1 ),我现在不得不使用具有管理员权限的Active Directory帐户调用进程(通过散列密码,在程序中解密,然后通过ProcessStartInfo对象调用它),如下所示:

private static void InstallPackage(string packagePath, string args = "")
        {
            log.DebugFormat("Entered 'InstallPackage' (packagePath: '{0}'; args: '{1}')", packagePath, args);
            ProcessStartInfo psi = new ProcessStartInfo();
            psi.FileName = packagePath;
            psi.Arguments = args;
            psi.WindowStyle = ProcessWindowStyle.Hidden;

            if (UseNetworkCredentials)
            {
                log.Debug("Network credential flag detected - using hard-coded network credentials for installation...");

                psi.Domain = "FOOBAR";
                psi.UserName = "SRVC_PatchInstaller";
                psi.Password = NetworkCredsPassword;
                psi.UseShellExecute = false;

                log.DebugFormat("Network credentials configured successfully (DOMAIN: {0}, USERNAME: {1})", psi.Domain, psi.UserName);
            }

            log.Debug("Starting installer with specified arguments...");
            Process inst = Process.Start(psi);
            log.Debug("Waiting for installer exit...");

            while (inst.HasExited == false)
                System.Threading.Thread.Sleep(100);

            log.DebugFormat("Installer process completed (Exit code: '{0}', Exit code meaning: '{1}', Duration (secs): {2})", 
                inst.ExitCode, ExitCodeDescriptions.ContainsKey(inst.ExitCode) ? ExitCodeDescriptions[inst.ExitCode] : "UNKNOWN",
                (inst.ExitTime - inst.StartTime).TotalSeconds.ToString("0.##"));
            return;
        }

当我们在总公司的一台笔记本电脑上进行测试时,这款产品很受欢迎,但现在正在用户的笔记本电脑上进行测试,这将返回以下内容:

2018-01-30 14:39:33,591 InstallPackage [DEBUG] - Entered 'InstallPackage' (packagePath: 'C:\windows\ccmcache\4a\foo\bar.exe'; args: '/s /f1"C:\windows\ccmcache\4a\foo\bar.iss"')
2018-01-30 14:39:33,624 InstallPackage [DEBUG] - Network credential flag detected - using hard-coded network credentials for installation...
2018-01-30 14:39:33,626 InstallPackage [DEBUG] - Network credentials configured successfully (DOMAIN: FOOBAR, USERNAME: SRVC_PatchInstaller)
2018-01-30 14:39:33,626 InstallPackage [DEBUG] - Starting installer with specified arguments...
2018-01-30 14:39:38,005 InstallPackage [DEBUG] - Waiting for installer exit...
2018-01-30 14:39:38,109 InstallPackage [DEBUG] - Installer process completed (Exit code: '-1073741502', Exit code meaning: 'UNKNOWN', Duration (secs): 2.24)

现在,我做了一些关于此错误代码的谷歌搜索,发现退出代码实际上是NTSTATUS错误0xC0000142,也称为“STATUS_DLL_INIT_FAILED”。我还found these questions与此问题有关。导致此异常的原因是什么?如何解决?

1 :这背后的原因是InstallShield可执行文件正在尝试将文件解压缩到C:\Users\USER_NAME\AppData\文件夹。由于LocalSystem帐户缺少此文件夹,因此安装程序会将文件提取到C:\Windows\Temp文件夹,但之后不会查找同一文件夹,导致安装程序炸毁。

1 个答案:

答案 0 :(得分:0)

我发现问题是什么 - 当没有用户登录时,错误是SCCM试图安装软件。我认为这个错误是因为操作系统没有初始化user32.dll而引发的。