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

时间:2014-04-03 11:02:24

标签: c# winforms service

我编写了一个文件转换器,它将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;
            }

        }

请告诉我该怎么做。任何帮助表示赞赏。 谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用File.SetAttribute Method并提供各种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

<强> EDIT2:

您也可以使用:

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