我有一个文件存储库服务,大部分工作。问题是,一旦我开始将DirectorySecurity实现到我遇到问题的方法中。目录创建得很好,为目录分配的帐户被授予访问权限,但所有权限最终都在“特殊权限”下。然而,这不是问题。当我尝试编写新文件时出现问题。我收到以下错误消息:
System.ServiceModel.FaultException'1 ...拒绝访问路径...
正如我所说,创建目录结构以保存文件。但是,该文件不会进入该文件夹。我确实看到了所有允许的用户,我可以在那里放置文件。但是,再次,在Windows中手动执行此操作我可以从目录运行.exe文件,尽管我拒绝了AccessControls中的权限。下面是'Put'方法的示例以及我用于构建DirectorySecurity对象的另一种方法。
我的问题:
对出现问题的任何想法,或有关防止可执行文件的安全建议?
在调试模式下运行时,Visual Studio 2012是否需要使用特定的“帐户”(例如NETWORK SERVICES“)?我没有将其添加到权限集中。
创建目录时是否存在计时问题?如果是这样会对Thread.Sleep有所帮助,以便让Windows能够赶上?
我在这里遗失或做错的任何其他建议/事情?
环境注意事项:Windows 7旗舰版,Visual Studio 2012(通过调试启动运行Windows窗体测试客户端)。该服务当前通过WAS在本地安装(在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 \ NETWORK SERVICES”(限制访问)和“NT AUTHORITY \ SYSTEM”(完全访问权限)的权限。我仍然得到相同的拒绝消息。关闭DirectorySecurity实践可以正常工作。这必须是“混合”或规则的问题。即使目录到位,重复尝试也会失败。