【问题标题】:Windows Service cannot run a bat file properly on Windows XP - C#Windows 服务无法在 Windows XP 上正确运行 bat 文件 - C#
【发布时间】:2015-12-04 09:40:06
【问题描述】:

我有一个 Windows 服务,我希望它能够自动更新。 因此,当我的服务了解到有更新时,它会创建一个 .bat 文件:

   File.WriteAllLines(updateFileName, new string[] {"sc stop "+ServiceName, 
    "ping 10.10.10.10 -n 8", "DEL "+ServicePath, 
    "RENAME "+NewServicePath+" "+ServicePath, "sc start "+ServiceName})

然后我创建一个进程并启动它,这两个我都试过了

Process updateProcess = new Process();
updateProcess.StartInfo.FileName = updateFileName;
updateProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
updateProcess.StartInfo.CreateNoWindow = true;
updateProcess.StartInfo.Verb = "runas";
updateProcess.Start();

还有这个

var psi = new ProcessStartInfo
            {
                CreateNoWindow = true,
                UseShellExecute = false,
                FileName = "cmd.exe",
                Arguments = "/C " + updateFileName,
                WindowStyle = ProcessWindowStyle.Hidden,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                Verb = "runas",
                ErrorDialog = false
            };

            updateProcess.StartInfo = psi;
            updateProcess.Start();

我还尝试编写一个控制台应用程序 updateService.exe 来停止、更新和启动服务。在这种情况下,我使用ServiceDirectory\updateService.exe 创建了一个 .bat 文件并尝试运行它。

我的服务使用LocalSystem 帐户。

以上所有这些都可以在 Windows 7 上完美运行。

但在 Windows XP 上它不起作用:

  1. 服务停止,ping 正常,删除和重命名命令不起作用, 服务不再启动。
  2. 服务使用updateService.exe 启动.bat 文件,服务停止并再次启动,但服务.exe 文件没有更新。

所以,我想知道如何强制我的服务在 Windows XP 上自我更新,我认为特权存在一些问题,但我不知道如何处理它们。

【问题讨论】:

  • 显而易见的调试技术是将这些命令的输出重定向到文件,这样您就可以找出它们失败的原因。您可能需要` 2>` 来捕获错误消息。也就是说,XP 不再受支持。
  • @MSalters 我使用输出文件,但那里什么也没有,文件保持空白。我知道 XP 不支持了,但我们公司仍在使用近百台装有 Windows XP 的计算机,我需要这项服务才能在它们上工作

标签: c# batch-file service windows-xp


【解决方案1】:

首先,我建议在命令提示符窗口中手动运行创建的批处理文件,以查看服务运行时命令 DELRENAME 可能出现的问题。

其次,没有公布变量NewServicePathServicePath的值,这可能在这里很重要。

我建议进一步使用而不是

DEL ServicePath
RENAME NewServicePath ServicePath

批号

MOVE /Y "Name of new file with full path" "Name of file to update with full path"

使用带有参数/Y的命令MOVE覆盖已经存在的文件比使用DELRENAME作为命令要好得多RENAME 要求第二个参数只是没有路径的文件名。此外,服务文件仅在使用 MOVE 更新一次后存在。

建议对两个文件都使用完整路径,因为在创建进程时或在批处理文件中都没有设置批处理文件执行的当前目录。

使用cd /D "%~dp0" 作为批处理文件的第一行,可以将批处理文件的当前目录设置为批处理文件的目录。

【讨论】:

  • 1.如果我手动启动它们,创建的 .bat 文件可以完美运行并且一切正常。 2.所有路径都是正确的(我在文件创建后检查了它们),并且重命名用作第二个参数仅文件名,而不是完整路径。我现在将尝试用 MOVE /Y 替换 DEL 和 RENAME,谢谢
  • 我已将 DEL 和 RENAME 更改为 MOVE /Y 并确定了这一点:当我的服务启动此 .bat 文件时,命令 sc stopping 工作正常,然后什么都没有 - 命令 move /Ysc start 不要执行。当我手动启动 .bat 文件时,它工作正常。所以我认为问题出在特权上——但我的服务在 LocalSystem 下启动并以Verb="runas" 启动 .bat 文件,我认为这一定足够了......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 2014-10-06
  • 2010-12-25
相关资源
最近更新 更多