如何通过Windows服务更改文件夹/文件权限

本文关键字:文件夹 文件 权限 何通过 Windows 服务 | 更新日期: 2023-09-27 17:56:36

>我编写了一个文件转换器,它将dwfx文件转换为tiff格式。它有两种操作方式。首先是手动转换,用户选择输入文件夹和输出文件夹,即使目标或源文件夹具有只读属性,文件也会被转换。其次是通过服务运行,其中转换作为服务进行。我在这里面临的问题是,每当我执行与服务相同的过程时,它都会显示只读文件拒绝访问。我尝试通过代码删除或更改属性,但它显示system.unauthorized access exception.我还尝试使应用程序成为完全信任的应用程序,因此将 app.manifest 添加到其中,但事件日志仍显示相同的错误。我以具有管理员权限的本地帐户运行该服务。我不知道该怎么办。

我的代码是

private bool GetFolderAccess(string sDirectory)
        {            
            try
            {
                //Commented lines are for changing the permission when the exception is thrown everytime.
                /*DirectoryInfo info = new DirectoryInfo(sDirectory);
                WindowsIdentity self = System.Security.Principal.WindowsIdentity.GetCurrent();
                DirectorySecurity ds = info.GetAccessControl();
                ds.AddAccessRule(new FileSystemAccessRule(self.Name,FileSystemRights.FullControl,InheritanceFlags.ObjectInherit |InheritanceFlags.ContainerInherit,PropagationFlags.None,AccessControlType.Allow));
                info.SetAccessControl(ds); */        
                FileStream fs = new FileStream(sDirectory + "testfile.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
                StreamWriter s = new StreamWriter(fs);                
                s.Dispose();
                File.Delete(sDirectory + "''testfile.txt");
                return true;
            }
            catch (Exception ex)
            {
                eventLog1.WriteEntry(ex.ToString());
                return false;
            }
        }

请告诉我该怎么做。任何帮助,不胜感激。谢谢

如何通过Windows服务更改文件夹/文件权限

您可以使用 File.SetAttribute 方法并给出各种 FileAttributes。您也可以使用 GetAccessControl。

下面是一个示例:

public static bool HasWritePermissionOnDir(string path)
{
var writeAllow = false;
var writeDeny = false;
var accessControlList = Directory.GetAccessControl(path);
if (accessControlList == null)
    return false;
var accessRules = accessControlList.GetAccessRules(true, true, 
                            typeof(System.Security.Principal.SecurityIdentifier));
if (accessRules ==null)
    return false;
foreach (FileSystemAccessRule rule in accessRules)
{
    if ((FileSystemRights.Write & rule.FileSystemRights) != FileSystemRights.Write) 
        continue;
    if (rule.AccessControlType == AccessControlType.Allow)
        writeAllow = true;
    else if (rule.AccessControlType == AccessControlType.Deny)
        writeDeny = true;
}
return writeAllow && !writeDeny;
}

编辑:

要更改权限:

    FileAttributes attributes = File.GetAttributes(path);
    if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
    {
        // Remove read only property of the file.
        File.SetAttributes(file, attributes & ~FileAttributes.ReadOnly);
    } 

另外,尝试在管理员模式下运行您的Visual Studio。

编辑2:

您还可以使用:

FileInfo fileInfo = new FileInfo(pathToAFile);
fileInfo.IsReadOnly = false;
fileInfo.Refresh();