1

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

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

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

我的问题:

  1. 关于出了什么问题的任何想法,或者关于防止可执行文件的安全建议?

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

  3. 创建目录时是否存在时间问题?如果是这样,是否会对 Thread.Sleep 有所帮助以让 Windows 赶上来?

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

环境注意事项:Windows 7 Ultimate、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 做法可以正常工作。这一定是“混合”或规则的问题。即使目录存在,重复尝试也会失败。

4

0 回答 0