WCF文件存储库和安全性-保存文件时权限出错

WCF文件存储库和安全性-保存文件时权限出错,wcf,security,tcp,access-rules,Wcf,Security,Tcp,Access Rules,我有一个文件存储库服务,在大多数情况下都可以使用。问题是,一旦我开始在方法中实现DirectorySecurity,我就遇到了问题。目录创建得很好,分配给目录的帐户被授予访问权限,但所有权限最终都在“特殊权限”下。然而,这不是问题所在。当我试图写一个新文件时,问题就出现了。我收到以下错误消息: System.ServiceModel.FaultException'1。。。访问路径。。。被拒绝。 正如我所说,创建目录结构是为了保存文件。但是,该文件无法进入文件夹。我确实看到了所有允许的用户,我可以

我有一个文件存储库服务,在大多数情况下都可以使用。问题是,一旦我开始在方法中实现DirectorySecurity,我就遇到了问题。目录创建得很好,分配给目录的帐户被授予访问权限,但所有权限最终都在“特殊权限”下。然而,这不是问题所在。当我试图写一个新文件时,问题就出现了。我收到以下错误消息:

System.ServiceModel.FaultException'1。。。访问路径。。。被拒绝。

正如我所说,创建目录结构是为了保存文件。但是,该文件无法进入文件夹。我确实看到了所有允许的用户,我可以将文件放在那里。不过,在windows中手动执行此操作时,我可以从目录中运行.exe文件,尽管我拒绝了AccessControls中的权限。下面是“Put”方法的示例,以及我用来构建DirectorySecurity对象的另一个方法

我的问题是:

  • 有没有关于什么地方出了问题的想法,或者关于防止执行错误的安全建议

  • Visual Studio 2012在调试模式下运行时是否需要使用特定的“帐户”(例如网络服务)?我没有将其添加到权限集中

  • 创建目录时是否有时间问题?如果有,请点击帮助线程。请稍睡片刻,让Windows赶上进度

  • 我在这里遗漏或做错的任何其他建议/事情

  • 环境说明:Windows 7 Ultimate,Visual Studio 2012(通过调试启动运行Windows窗体测试客户端)。该服务当前通过WAS(在Services.msc中运行)在本地安装。这是一个net.Tcp服务,其端点公开给使用ChannelFactory手动构建的客户端和代理。Get方法似乎工作正常。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;
            }
    
    //----------------------------
    //WCF服务-PutText方法
    //----------------------------
    //注意:dir=虚拟目录
    公共boolputtextfile(字符串目录、字符串文件名、字符串数据)
    {
    字符串路径;
    字符串fExt;
    目录信息d;
    #区域空/值检查
    //...
    #端区
    //检查并强制执行文件扩展名
    fExt=Path.GetExtension(fileName.ToLower();
    if(fExt!=“.txt”&&fExt!=“.xml”&&fExt!=“.csv”)
    {
    fileName=Path.GetFileNameWithoutExtension(fileName)+“.txt”;
    }
    //检查目录是否存在
    d=新目录信息(Path.Combine(this.\u fileRepositoryRoot,dir));/\u fileRepositoryRoot取自.config
    如果(!d.Exists)
    {
    尝试
    {
    DirectorySecurity ds=this.CreateDirSecurityObj()//