我有一个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上它不起作用:
所以,我想知道如何强制我的服务在Windows XP上更新自己,我认为priveleges存在一些问题,但我不知道如何处理它们。
答案 0 :(得分:1)
首先,我建议在命令提示符窗口中手动运行创建的批处理文件,以查看服务运行时命令 DEL 和 RENAME 可能出现的问题。 / p>
其次,没有公布变量Start Time
End Time
Duration
Startup Delay
和NewServicePath
的值,这些值在这里可能很重要。
我建议进一步使用而不是
ServicePath
批次代码
DEL ServicePath
RENAME NewServicePath ServicePath
使用带参数MOVE /Y "Name of new file with full path" "Name of file to update with full path"
的命令 MOVE 覆盖现有文件比使用 DEL 和 RENAME 作为命令<更好strong> RENAME 要求第二个参数只是没有路径的文件名。此外,使用 MOVE 时,服务文件仅在更新一次后才存在。
建议使用两个文件的完整路径,因为在创建进程或批处理文件内时未设置批处理文件执行的当前目录。
使用/Y
作为批处理文件的第一行,可以将批处理文件的当前目录设置为批处理文件的目录。