赋予当前用户可操作指定文件夹的权限
相信很多人都会讨厌Windows下获取管理员权限时弹出的对话框提醒吧。大部分软件是不需要管理员权限的,但是因为系统盘文件权限的问题,不得不使用管理员权限。如果你也遇到了相同的情况,并且也不想看到管理员权限的提醒框,那就看一下解决方案吧。
情况:系统盘里的某些文件修改,需要管理权限。安装在C盘下的程序升级时,可能也会遇到权限不足的情况。
如果你的程序中还有其他的操作,必须要以管理员运行的,最好把这些操作的代码写到单独的EXE中,以管理员身份启动这些EXE,而不是每次启动主程序时都弹需要管理员权限的对话框,这样用户体验就太差了、太差了、太差了。
好吧,废话到此为止。
.net framework框架中,的文件安全性操作、例如DirectorySecurity、FileSecurity、FileSystemAccessRule等去管理文件夹或者文件权限时,需要考虑很多,不是管理员身份去操作容易失败,win7、win10下权限规则差距等,简而言之,不太好用。下面我说一个简单又不耽误工夫的方法,就是使用cacls(没使用过的自行google或者msdn,不多说,使用很简单)。
假如我希望我当前windows用户启动的程序想要具有对某些文件夹的全部控制权,就可以这么写。
Task.Run(() =>
{
Process process = new Process();
process.StartInfo.FileName = "cacls.exe";
process.StartInfo.Arguments = " " + dirPath + " " + " /t " + " /g " + @Environment.UserName + ":" + "f";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.StandardInput.WriteLine("y");
string strOutput = process.StandardOutput.ReadToEnd();
Console.WriteLine(strOutput);
process.WaitForExit();
process.Close();
});
很简单就获取了对指定文件夹里所有文件的所有权。
昨天没有写完,今天继续。继续权限的问题(VirtualStore)。
环境:程序安装在系统盘,配置文件在安装目录下。此时,程序运行时(不以管理员身份运行),读取配置文件(或者其他resource文件),文件(包括文件夹)会被首先复制到VirtualStore,读取和修改的文件其实都会在VirtualStore中,并且你程序运行的当前路径也会是在VirtualStore对应的目录下。
那么问题出现了。如果你有一个自动更新的程序,需要更新配置文件,如果只是覆盖安装目录下的文件,在程序启动后,读取的文件则依旧是VirtualStore的旧版本配置文件。
简单的解决方法:一般再说,你的升级程序是需要管理员身份运行的,在你读取升级信息时,应该包含了是否需要删除旧的配置文件的情况,删除文件的操作也在升级exe中进行,防止权限不足,删除失败。
希望对遇到相同问题的朋友有帮助