C# 控制台应用程序 - 修改权限
C# Console App - Modify Permissions
我有一个 Windows 服务,它检查网络 API 的更新,当它找到它们时,它会下载它们,将它们解压缩到一个临时目录,然后启动一个单独的控制台应用程序,停止Windows 服务并复制所有文件覆盖旧文件。
问题是更新程序没有权限覆盖该目录中的文件,c:\Program Files (x86)\myApp
,除非它以管理员身份运行。我试图将带有 requestedExecutionLevel
requireAdministrator
的 .manifest
文件添加到更新脚本中,但这没有任何作用。启动它的服务是 运行 as LocalSystem,所以我尝试了 asInvoker
,但也没有用。
有趣的是,脚本的一部分有一个 StreamWriter 来记录事件。我可以在目录中创建一个文件,但没有权限编辑该文件。
我最初让更新程序从应用程序的 WPF 部分而不是 Windows 服务启动,但后来意识到如果没有用户登录,它就不会更新。有没有解决的办法?这是我正在使用的相关片段:
// Load the update path
Console.WriteLine("Loading update path from UpdatePath.txt");
string[] zipDir = File.ReadAllLines("UpdatePath.txt");
Console.WriteLine("Loading update from: " + zipDir);
// Copy all the updated files to the current directory (this will include the renamed service.exe)
Console.WriteLine("Copying zip contents to current directory ( " + Directory.GetCurrentDirectory() + " )");
string[] files = Directory.GetFiles(zipDir[0], "*.*", SearchOption.TopDirectoryOnly);
foreach (string f in files)
{
string fileName = Path.GetFileName(f);
if(fileName != "Configuration.ini") {
Console.WriteLine("Copying " + f + " =>" + Directory.GetCurrentDirectory() +"//" + fileName);
File.Copy(f, fileName, true); //Breaks right here
}
}
Console.WriteLine()
曾经写过一个文件,但它在那里也坏了所以我改变了它。
我有以下代码来授予对我创建的文件夹的访问权限。
需要使用命名空间“using System.Security.AccessControl;”
private static void CreateSomeFolder()
{
try
{
//Create some folder and grant full permissions
var someFolder = "SomeDataFolderPath";
if (Directory.Exists(someFolder)) return;
Directory.CreateDirectory(someFolder);
GrantAccess(someFolder);
}
catch (Exception ex)
{
log.Error("Folder Creation Error - ", ex);
}
}
private static bool GrantAccess(string fullPath)
{
var dInfo = new DirectoryInfo(fullPath);
var dSecurity = dInfo.GetAccessControl();
dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
dInfo.SetAccessControl(dSecurity);
return true;
}
我有一个 Windows 服务,它检查网络 API 的更新,当它找到它们时,它会下载它们,将它们解压缩到一个临时目录,然后启动一个单独的控制台应用程序,停止Windows 服务并复制所有文件覆盖旧文件。
问题是更新程序没有权限覆盖该目录中的文件,c:\Program Files (x86)\myApp
,除非它以管理员身份运行。我试图将带有 requestedExecutionLevel
requireAdministrator
的 .manifest
文件添加到更新脚本中,但这没有任何作用。启动它的服务是 运行 as LocalSystem,所以我尝试了 asInvoker
,但也没有用。
有趣的是,脚本的一部分有一个 StreamWriter 来记录事件。我可以在目录中创建一个文件,但没有权限编辑该文件。
我最初让更新程序从应用程序的 WPF 部分而不是 Windows 服务启动,但后来意识到如果没有用户登录,它就不会更新。有没有解决的办法?这是我正在使用的相关片段:
// Load the update path
Console.WriteLine("Loading update path from UpdatePath.txt");
string[] zipDir = File.ReadAllLines("UpdatePath.txt");
Console.WriteLine("Loading update from: " + zipDir);
// Copy all the updated files to the current directory (this will include the renamed service.exe)
Console.WriteLine("Copying zip contents to current directory ( " + Directory.GetCurrentDirectory() + " )");
string[] files = Directory.GetFiles(zipDir[0], "*.*", SearchOption.TopDirectoryOnly);
foreach (string f in files)
{
string fileName = Path.GetFileName(f);
if(fileName != "Configuration.ini") {
Console.WriteLine("Copying " + f + " =>" + Directory.GetCurrentDirectory() +"//" + fileName);
File.Copy(f, fileName, true); //Breaks right here
}
}
Console.WriteLine()
曾经写过一个文件,但它在那里也坏了所以我改变了它。
我有以下代码来授予对我创建的文件夹的访问权限。
需要使用命名空间“using System.Security.AccessControl;”
private static void CreateSomeFolder()
{
try
{
//Create some folder and grant full permissions
var someFolder = "SomeDataFolderPath";
if (Directory.Exists(someFolder)) return;
Directory.CreateDirectory(someFolder);
GrantAccess(someFolder);
}
catch (Exception ex)
{
log.Error("Folder Creation Error - ", ex);
}
}
private static bool GrantAccess(string fullPath)
{
var dInfo = new DirectoryInfo(fullPath);
var dSecurity = dInfo.GetAccessControl();
dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
dInfo.SetAccessControl(dSecurity);
return true;
}