我有一个文件库服务,大部分的作品。 问题是,一旦我开始实施DirectorySecurity到我跑进问题的方法。 该目录创建就好了,指定的账户目录定接入,但所有权限下的“特殊权限”结束。 然而,这是没有问题的。 当我尝试写一个新的文件,就会出现问题。 我收到以下错误信息:
System.ServiceModel.FaultException'1 ...到...路径访问被拒绝。
正如我所说的,是创建的目录结构来保存文件。 该文件,但是,不让它进入文件夹。 我看到我的所有允许的用户,我可以在里面放置文件。 然而,再次人工手动操作的窗口,我可以,尽管我不承认在AccessControls许可的事实,运行.exe文件从目录中的文件。 下面是“把”方法和我使用来构建DirectorySecurity对象的另一种方法的一个例子。
我的问题有:
什么任何想法是怎么了,或者建议的安全性以防止可执行文件?
是否的Visual Studio 2012需要在调试模式下运行时要使用特定的“账户”(例如网络服务“)?我没有补充说的权限集。
创建目录时,有一个时机的问题? 如果是的话会打帮助的Thread.Sleep了一下,以使Windows赶上?
任何其他意见/东西我丢失或错在这里做了?
注意环境:Windows 7旗舰版,的Visual Studio 2012(运行通过调试启动Windows窗体测试客户端)。 该服务目前本地安装通过为(在SERVICES.MSC运行)。 这是一个服务的net.tcp与暴露在客户端和代理使用的ChannelFactory手动内置端点。 获取方法似乎很好地工作。 put方法不能把最后的文件到创建的目录,我有顾虑的权限实际上是正常工作。
//----------------------------
//WCF Service - PutText Method
//----------------------------
//NOTE: dir = virtual directory
public bool PutTextFile(string dir, string fileName, string data)
{
string path;
string fExt;
DirectoryInfo d;
#region Null / value checks
//...
#endregion
//check & enforce file extension
fExt = Path.GetExtension(fileName).ToLower();
if (fExt != ".txt" && fExt != ".xml" && fExt != ".csv")
{
fileName = Path.GetFileNameWithoutExtension(fileName) + ".txt";
}
//check directory exists
d = new DirectoryInfo(Path.Combine(this._fileRepositoryRoot, dir));//_fileRepositoryRoot is taken from .config
if (!d.Exists)
{
try
{
DirectorySecurity ds = this.CreateDirSecurityObj(); //<-- See method below
d.Create(ds);
}
catch (Exception e)
{
//...
}
}
//complete path
path = Path.Combine(this._fileRepositoryRoot, dir, fileName);
try
{
using (StreamWriter sw = File.CreateText(path))
{
sw.Write(data);
}
return true;
}
catch (Exception e)
{
//...
}
}
//-------------------------
//Directory Security Method
//-------------------------
//NOTE:
//"private string _myDomain" and "private string _myUserAccount" are pulled from an app.config file
private DirectorySecurity CreateDirSecurityObj()
{
System.Security.AccessControl.DirectorySecurity ds = new System.Security.AccessControl.DirectorySecurity();
//define User rights
FileSystemRights grantUserRights = FileSystemRights.AppendData;
grantUserRights |= FileSystemRights.Synchronize;
grantUserRights |= FileSystemRights.CreateDirectories;
grantUserRights |= FileSystemRights.CreateFiles;
grantUserRights |= FileSystemRights.ListDirectory;
grantUserRights |= FileSystemRights.Read;
grantUserRights |= FileSystemRights.Write;
grantUserRights |= FileSystemRights.Delete;
FileSystemRights denyUserRights = FileSystemRights.ExecuteFile;
denyUserRights |= FileSystemRights.ChangePermissions;
//define access rule
FileSystemAccessRule grantRule_User = new FileSystemAccessRule(Path.Combine(this._myDomain, this._myUserAccount), grantUserRights, AccessControlType.Allow);
FileSystemAccessRule denyRule_User = new FileSystemAccessRule(Path.Combine(this._myDomain, this._myUserAccount), denyUserRights, AccessControlType.Deny);
//add access rule
ds.AddAccessRule(grantRule_User);
ds.AddAccessRule(denyRule_User);
ds.AddAccessRule(grantRule_Admin);
return ds;
}
更新:我尝试添加为“NT AUTHORITY \网络服务”(有限访问)和“NT AUTHORITY \ SYSTEM”(完全访问)权限。 我仍然得到同样的拒绝消息。 关闭DirectorySecurity实践工作正常。 这必须是“混合”或规则的问题。 当目录到位重复尝试失败均匀。