我需要测试用户是否可以在实际尝试之前写入文件夹.
我已经实现了以下方法(在C#2.0中),它尝试使用Directory.GetAccessControl()方法检索文件夹的安全权限.
private bool hasWriteAccessToFolder(string folderPath)
{
try
{
// Attempt to get a list of security permissions from the folder.
// This will raise an exception if the path is read only or do not have access to view the permissions.
System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(folderPath);
return true;
}
catch (UnauthorizedAccessException)
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
当我在谷歌搜索如何测试写入访问时,没有出现这样的情况,实际测试Windows中的权限似乎非常复杂.我担心我过度简化了事情并且这种方法并不健全,尽管它似乎确实有效.
我的方法是否可以测试当前用户是否具有写访问权限?
基本上,我想在实际尝试打开文件之前检查是否有权打开文件; 除非必须,否则我不想使用try/catch进行此检查.有没有我可以检查的文件访问属性?
好的,所以我在很多地方搜索过这个问题的答案,但如果我错过了一些明显的东西,我会对任何链接持开放态度.
我有兴趣在用户尝试打开特定文件时向用户生成合理的错误消息,但无论出于何种原因,程序都无法访问该文件.我想区分以下情况:
我正在使用FileStream对象.我已经查看了用于实例化FileStream的msdn文档,并且我完全不清楚Exception是否为上述内容做了什么,以及如何区分它们.我承认我在Windows编程方面的经验有限,所以我可能会遗漏一些明显的东西.如果是这样,我道歉.
我有一个问题实际上已经解决了,但我完全不明白为什么它会像这样.
所以我有一个网络共享,我想简单地验证我是否有权在该共享中创建新文件和目录.我用了两种方法来解决这个问题,但两者都得到了不同的结果.我的测试用例是我无法在该共享上创建文件和目录:
try
{
var testPath = Path.Combine(path, testDirectory)
Directory.CreateDirectory(testPath)
}
catch
{
// No access
}
Run Code Online (Sandbox Code Playgroud)
这是一种我根本不喜欢的方式,但它有效...我在这里有一个例外,所以它正确地说我没有特定路径的权限.
try
{
var writePermission = new FileIOPermission(FileIOPermissionAccess.Write, path)
var appendPermission = new FileIOPermission(FileIOPermissionAccess.Append, path)
writePermission.Demand()
appendPermission.Demand()
}
catch
{
// No access
}
Run Code Online (Sandbox Code Playgroud)
通过这种方法,我没有任何异常,所以它告诉我,我有权创建新文件 - 实际上并非如此.
谁知道第二种方法有什么问题?
我们将.Net 4.0类库移植到.Net Core 1.1,并遇到了对.Net core CLR中文件安全性和权限的非常有限支持的问题。我们试图按如下所示设置对文件的访问控制权限,并且FileInfo似乎不再具有任何SetAccessControl或GetAccessControl。
// Get a FileSecurity object that represents the
// current security settings.
FileSecurity fSecurity = File.GetAccessControl(fileName);
// Add the FileSystemAccessRule to the security settings.
fSecurity.AddAccessRule(new FileSystemAccessRule(account,
rights, controlType));
// Set the new access settings.
File.SetAccessControl(fileName, fSecurity);
Run Code Online (Sandbox Code Playgroud)
目标只是向文件的当前所有者添加执行权,我们非常感谢您的帮助。
我需要获取 C 驱动器中允许写入和读取的所有文件的列表,所以我尝试如下:
string[] files = Directory.GetFiles(@"C:\\", "*.*", SearchOption.AllDirectories);
foreach (string file in files)
{
Console.WriteLine(file);
}
Run Code Online (Sandbox Code Playgroud)
但我立即得到UnauthorizedAccess Exception
我想编写一个检查共享目录权限的代码,我检查多个解决方案但是在尝试获取本地目录权限时它运行良好但是当我为共享目录创建测试用例时它失败了.
我在这个问题中尝试了一些例子: SOF:check-for-directory-and-file-write-permissions-in-net
但它只适用于本地目录.
例如,我使用了这个类:
public class CurrentUserSecurity
{
WindowsIdentity _currentUser;
WindowsPrincipal _currentPrincipal;
public CurrentUserSecurity()
{
_currentUser = WindowsIdentity.GetCurrent();
_currentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
}
public bool HasAccess(DirectoryInfo directory, FileSystemRights right)
{
// Get the collection of authorization rules that apply to the directory.
AuthorizationRuleCollection acl = directory.GetAccessControl()
.GetAccessRules(true, true, typeof(SecurityIdentifier));
return HasFileOrDirectoryAccess(right, acl);
}
public bool HasAccess(FileInfo file, FileSystemRights right)
{
// Get the collection of authorization rules that apply to the file.
AuthorizationRuleCollection acl = file.GetAccessControl()
.GetAccessRules(true, true, typeof(SecurityIdentifier)); …Run Code Online (Sandbox Code Playgroud) 我需要以递归方式遍历C#中的目录.我在做类似这样.但是在迭代系统文件夹时抛出异常.如何在抛出异常之前检查它?
我需要检查当前用户是否在Program Files文件夹中具有写权限.
主要问题发生在Vista/7中 - 如果我只是尝试在此位置创建临时文件,我会得到一个异常,即使用户可以使用Windows资源管理器执行此类操作(允许UAC提升后).听起来很合理,因为流程本身并没有以管理员权限运行.
然后我尝试使用这个解决方案,但我总是回到"真实",即使我尝试使用标准(非管理员)用户运行它.
我最终希望能够回答的是,如果用户试图在其中创建目录Program Files,他是否需要提供管理员凭据,或者只需在UAC中单击"继续"即可?
我正在寻找一种方法来回答这个问题,而不是自己提出UAC弹出窗口(任何类型).有一个相对简单的方法吗?
感谢您提供我使用UserData文件夹,但我只需要知道用户是否在该文件夹中具有写访问权限,以便我可以决定是否应该尝试执行自动更新(运行msi),或者不.
c# ×8
.net ×4
directory ×2
permissions ×2
acl ×1
core ×1
file ×1
file-access ×1
filestream ×1
filesystems ×1
security ×1
windows ×1
winforms ×1