0

我有一个每 10 分钟运行一次的 Windows 服务,它会检查以确保我们软件的所有正确部分都已安装并且是最新的。每次执行该服务时,它都会使用以下函数来安装可执行文件:

    public static bool InstallControlPanel()
    {
        try
        {
            //this will change
            string sSetupFile = @"C:\Projects\SyncAgentV2\SyncAgentV2.ControlPanel.Installer\SyncAgentV2.ControlPanel.Installer\Express\SingleImage\DiskImages\DISK1\setup.exe";

            if (!System.IO.File.Exists(sSetupFile))
            {
                Debug.WriteLine("Service Installer doesn't exist.");
                return false;
            }

            Process oProcess = new Process();

            oProcess.StartInfo.ErrorDialog = true;
            oProcess.StartInfo.UseShellExecute = true;
            oProcess.StartInfo.Arguments = "/s /v/qn";
            oProcess.StartInfo.FileName = sSetupFile;
            oProcess.Start();
            oProcess.WaitForExit();

            return true;
        }
        catch (Exception oEx)
        {
            Debug.WriteLine(oEx);
            return false;
        }
    }

当我从服务调用此方法时对其进行调试时,它会运行并执行所有步骤,返回 true,但不会安装可执行文件。我可以从 WPF 调用这个方法并且它可以工作,所以问题一定是服务调用它的方式。

现在,该服务设置为作为本地系统登录。我怀疑某项服务无法按照我想要的方式运行,或者我需要它以其他用户身份登录。有人可以验证这一点或将我指向不同的方向吗?

编辑:此方法有效,但当我从服务调用它时无效。

4

1 回答 1

2

你在win7下运行你的进程吗?事件日志中的安装程序是否有任何错误退出代码?可能您的安装程序需要显示 UI,并且受到Session 0 隔离的影响。

由于进程由 Windows 服务启动 - 它与当前登录的用户隔离。您需要在当前登录的用户上下文中运行安装程序。有一个 WinAPI 函数 - CreateProcessAsUser / CreateProcessWithToken。不幸的是,这些函数在 .net 基类库中不存在,必须通过 PInvoke 调用。这是一篇很棒的文章,描述了如何实现包装器以在用户上下文中启动任何命令

于 2013-05-23T19:33:01.547 回答