我编写了一个简单的C#程序,它将本地文件的文件版本与服务器的文件版本进行比较,如果不匹配,它应该用服务器的本地副本覆盖本地副本。下面的代码段。
using System;
using System.Diagnostics;
using System.Security.Principal;
namespace Test
{
public class FileVersionComparer
{
public static void Main()
{
// Print the user name
Console.WriteLine("This app is launched by - {0}",WindowsIdentity.GetCurrent().Name);
// Get the server file version
string serverFilePath = @"\\myserver\folder\test.exe";
FileVersionInfo serverVersionInfo = FileVersionInfo.GetVersionInfo(serverFilePath);
string serverFileVersion = serverVersionInfo.FileVersion;
Console.WriteLine("Server file version : {0}", serverFileVersion);
// Get the local file version
string localFilePath = @"C:\Windows\test.exe";
FileVersionInfo localVersionInfo = FileVersionInfo.GetVersionInfo(localFilePath);
string localFileVersion = localVersionInfo.FileVersion;
Console.WriteLine("Local file version : {0}", localFileVersion);
// Compare and overwrite if version is not same
if(!string.Equals(localFileVersion, serverFileVersion,StringComparison.OrdinalIgnoreCase))
{
File.Copy(serverFilePath, localFilePath, true);
}
else
Console.WriteLine("File version is same");
}
}
}
此程序作为子进程和父应用程序启动,因此子进程在NT AUTHORITY \ SYSTEM帐户下运行。该程序在我的机器上工作正常,但无法在几台机器上检索本地文件版本(返回空字符串,没有异常)。在它返回空文件版本的机器上,如果我从命令提示符作为普通用户运行程序并作为独立进程,它能够正确检索本地文件版本。
注意:即使在所有计算机上作为子进程启动,也能够检索服务器文件版本。
我还尝试将本地文件从C:\ Windows复制到C:\ Temp(使用File.Copy()API)来测试当同一文件位于不同位置时是否可以读取属性。但是程序会抛出文件访问异常(从父应用程序运行时)。 C:\ Temp没有访问限制。此外,从技术论坛,我了解NT AUTHORITY \ SYSTEM是一个管理员帐户。
我不明白为什么程序在NT AUTHORITY \ SYSTEM帐户下运行时无法检索本地文件版本以及为什么它在我的帐户作为正常流程运行时成功(不是作为儿童过程)。
有人可以帮忙吗?感谢。