C#如何创建文件夹并指定Everyone完全访问权限

仙剑 2012-05-20 12:04:16
最近遇到一个棘手的问题

用C#创建文件夹

public bool WriteOperationLog(string category, string msg)
{
try
{
string dir = string.Empty;
string path = string.Empty;
if (string.IsNullOrEmpty(m_log_path) || string.IsNullOrEmpty(m_log_file_name))
{
error_msg = "No log file name or log file path.";
return false;
}
if (Path.IsPathRooted(m_log_path))
{
dir = m_log_path;
}
else
{
dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, m_log_path);
}
Directory.CreateDirectory(dir); //创建文件夹
path = Path.Combine(dir, m_log_file_name + ".txt");
FileStream f;
f = new FileStream(dir, FileMode.Append);
StreamWriter r = new StreamWriter(f);
r.WriteLine(string.Format("{0}t{1}t{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), category, msg));
r.Flush();
r.Close();
BackupLog();
DeleteLog();
return true;
}
catch (Exception ex)
{
error_msg = ex.ToString();
return false;
}
}


调用这个函数会报 “对路径“H:\Charley\MyApp\XJFIR\XJFIRClient\bin\Debug\log”的访问被拒绝”。

注:这个函数和调用程序不在同一个程序集。

然后,我想可能是没有权限创建目录,于是我想创建文件夹时加入Everyone的完全访问权限,从网上搜了一段代码,修改这个函数如下:

public bool WriteOperationLog(string category, string msg)
{
try
{
string dir = string.Empty;
string path = string.Empty;
if (string.IsNullOrEmpty(m_log_path) || string.IsNullOrEmpty(m_log_file_name))
{
error_msg = "No log file name or log file path.";
return false;
}
if (Path.IsPathRooted(m_log_path))
{
dir = m_log_path;
}
else
{
dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, m_log_path);
}
Directory.CreateDirectory(dir);
DirectoryInfo dir_info = new DirectoryInfo(dir);
DirectorySecurity dir_security = new DirectorySecurity();
dir_security.AddAccessRule(new FileSystemAccessRule("Everyone ", FileSystemRights.WriteData, AccessControlType.Allow));
dir_info.SetAccessControl(dir_security);
path = Path.Combine(dir, m_log_file_name + ".txt");
FileStream f;
f = new FileStream(dir, FileMode.Append);
StreamWriter r = new StreamWriter(f);
r.WriteLine(string.Format("{0}t{1}t{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), category, msg));
r.Flush();
r.Close();
BackupLog();
DeleteLog();
return true;
}
catch (Exception ex)
{
error_msg = ex.ToString();
return false;
}
}


可是运行又出现问题了:执行到 dir_security.AddAccessRule(new FileSystemAccessRule("Everyone ", FileSystemRights.WriteData, AccessControlType.Allow));
报:“此工作站和主域间的信任关系失败”。

实在没辙了,不曾想用C#创建一个目录还这么难,请高手指教,不胜感谢!!!

...全文
1003 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
仙剑 2012-05-21
  • 打赏
  • 举报
回复
非常感谢各位的回复,只是有一点不太明白

以前函数和调用程序在一个程序集里,没有遇到访问权限的问题,因为是使用运行程序的用户身份创建的文件夹,现在把函数放到一个独立的程序集,怎么就出现了访问权限的问题。
iyomumx 2012-05-20
  • 打赏
  • 举报
回复
指定用户名的时候,应该是用"计算机或域名\用户名"
  • 打赏
  • 举报
回复
创建一个目录?

目录已经存在了,还能再次创建?
iyomumx 2012-05-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

指定用户名的时候,应该是用"计算机或域名\用户名"


那我发布程序后,不再这个域中运行,怎么办呢
[/Quote]

用System.Environment.UserName属性和System.Environment.UserDomainName获取当前用户名和域名/主机名
蝶恋花雨 2012-05-20
  • 打赏
  • 举报
回复
参考http://hi.baidu.com/tyq_man/blog/item/92d934b450eaddc636d3ca89.html
/*  
需要添加以下命名空间:
using System.IO;
using System.Security.AccessControl;
*/

string sPath = Server.MapPath(文件夹名称字符串);
Directory.CreateDirectory(sPath);
addpathPower(sPath, "ASPNET", "FullControl");

//////////////////////////////////////////////////

public void addpathPower(string pathname, string username, string power)
{

DirectoryInfo dirinfo = new DirectoryInfo(pathname);

if ((dirinfo.Attributes & FileAttributes.ReadOnly) != 0)
{
dirinfo.Attributes = FileAttributes.Normal;
}

//取得访问控制列表
DirectorySecurity dirsecurity = dirinfo.GetAccessControl();

switch (power)
{
case "FullControl":
dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
break;
case "ReadOnly":
dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Read, AccessControlType.Allow));
break;
case "Write":
dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Write, AccessControlType.Allow));
break;
case "Modify":
dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Modify, AccessControlType.Allow));
break;
}
dirinfo.SetAccessControl(dirsecurity);
}

http://www.cnblogs.com/top5/archive/2010/04/12/1710141.html
仙剑 2012-05-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

指定用户名的时候,应该是用"计算机或域名\用户名"
[/Quote]

那我发布程序后,不再这个域中运行,怎么办呢

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧