WCF文件资源库和安全 - 错误在权限上保存文件(WCF File Repository and S

2019-09-29 06:00发布

我有一个文件库服务,大部分的作品。 问题是,一旦我开始实施DirectorySecurity到我跑进问题的方法。 该目录创建就好了,指定的账户目录定接入,但所有权限下的“特殊权限”结束。 然而,这是没有问题的。 当我尝试写一个新的文件,就会出现问题。 我收到以下错误信息:

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

正如我所说的,是创建的目录结构来保存文件。 该文件,但是,不让它进入文件夹。 我看到我的所有允许的用户,我可以在里面放置文件。 然而,再次人工手动操作的窗口,我可以,尽管我不承认在AccessControls许可的事实,运行.exe文件从目录中的文件。 下面是“把”方法和我使用来构建DirectorySecurity对象的另一种方法的一个例子。

我的问题有:

  1. 什么任何想法是怎么了,或者建议的安全性以防止可执行文件?

  2. 是否的Visual Studio 2012需要在调试模式下运行时要使用特定的“账户”(例如网络服务“)?我没有补充说的权限集。

  3. 创建目录时,有一个时机的问题? 如果是的话会打帮助的Thread.Sleep了一下,以使Windows赶上?

  4. 任何其他意见/东西我丢失或错在这里做了?

注意环境: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实践工作正常。 这必须是“混合”或规则的问题。 当目录到位重复尝试失败均匀​​。

文章来源: WCF File Repository and Security - Error in permissions on saving file