检查共享目录权限 - C#

2024-01-26

我想编写一段代码来检查共享目录权限,我检查了多个解决方案,但在尝试获取本地目录权限时效果很好,但当我为共享目录制作测试用例时它会失败。

我在这个问题中尝试举例:SOF:检查网络中的目录和文件写入权限 https://stackoverflow.com/questions/1281620/checking-for-directory-and-file-write-permissions-in-net

但它仅适用于本地目录。

例如,我使用了这个类:

 public class CurrentUserSecurity
{
    WindowsIdentity _currentUser;
    WindowsPrincipal _currentPrincipal;

    public CurrentUserSecurity()
    {
        _currentUser = WindowsIdentity.GetCurrent();
        _currentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
    }

    public bool HasAccess(DirectoryInfo directory, FileSystemRights right)
    {
        // Get the collection of authorization rules that apply to the directory.
        AuthorizationRuleCollection acl = directory.GetAccessControl()
            .GetAccessRules(true, true, typeof(SecurityIdentifier));
        return HasFileOrDirectoryAccess(right, acl);
    }

    public bool HasAccess(FileInfo file, FileSystemRights right)
    {
        // Get the collection of authorization rules that apply to the file.
        AuthorizationRuleCollection acl = file.GetAccessControl()
            .GetAccessRules(true, true, typeof(SecurityIdentifier));
        return HasFileOrDirectoryAccess(right, acl);
    }

    private bool HasFileOrDirectoryAccess(FileSystemRights right,
                                          AuthorizationRuleCollection acl)
    {
        bool allow = false;
        bool inheritedAllow = false;
        bool inheritedDeny = false;

        for (int i = 0; i < acl.Count; i++)
        {
            FileSystemAccessRule currentRule = (FileSystemAccessRule)acl[i];
            // If the current rule applies to the current user.
            if (_currentUser.User.Equals(currentRule.IdentityReference) ||
                _currentPrincipal.IsInRole(
                                (SecurityIdentifier)currentRule.IdentityReference))
            {

                if (currentRule.AccessControlType.Equals(AccessControlType.Deny))
                {
                    if ((currentRule.FileSystemRights & right) == right)
                    {
                        if (currentRule.IsInherited)
                        {
                            inheritedDeny = true;
                        }
                        else
                        { // Non inherited "deny" takes overall precedence.
                            return false;
                        }
                    }
                }
                else if (currentRule.AccessControlType
                                                .Equals(AccessControlType.Allow))
                {
                    if ((currentRule.FileSystemRights & right) == right)
                    {
                        if (currentRule.IsInherited)
                        {
                            inheritedAllow = true;
                        }
                        else
                        {
                            allow = true;
                        }
                    }
                }
            }
        }

        if (allow)
        { // Non inherited "allow" takes precedence over inherited rules.
            return true;
        }
        return inheritedAllow && !inheritedDeny;
    }
}

它检查当前模拟对目录或文件的权限。 检查本地目录时所有测试用例都正确通过,但其中一些在共享目录中失败,这是我想解决的问题,那么有什么解决方案吗?

尽管目录没有写权限,但以下测试用例失败:

        [TestMethod]
    public void HasAccess_NotHaveAccess_ReturnsFalse()
    {
        CurrentUserSecurity cus = new CurrentUserSecurity();
        bool result = cus.HasAccess(new DirectoryInfo(@"\\sharedpc\readonly"), System.Security.AccessControl.FileSystemRights.Write);
        Assert.AreEqual(result, false);
    }

您的代码 WOMM。我鼓励您弄清楚为什么标准 .NET 类失败(在您的环境中)直接使用 Win32 API 来发现 BCL 隐藏的任何潜在问题。

如果您尝试这种较低级别的方法,它会产生错误,让您了解 BCL 类的问题是什么,请祈祷或使用它作为解决方法.

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

class MainConsole
{
    [DllImport("Netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    static extern int NetShareGetInfo(
        [MarshalAs(UnmanagedType.LPWStr)] string serverName,
        [MarshalAs(UnmanagedType.LPWStr)] string netName,
        Int32 level,
        out IntPtr bufPtr);

    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetSecurityDescriptorDacl(
        IntPtr pSecurityDescriptor,
        [MarshalAs(UnmanagedType.Bool)] out bool bDaclPresent,
        ref IntPtr pDacl,
        [MarshalAs(UnmanagedType.Bool)] out bool bDaclDefaulted
        );

    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetAclInformation(
        IntPtr pAcl,
        ref ACL_SIZE_INFORMATION pAclInformation,
        uint nAclInformationLength,
        ACL_INFORMATION_CLASS dwAclInformationClass
     );

    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    static extern int GetAce(
        IntPtr aclPtr,
        int aceIndex,
        out IntPtr acePtr
     );

    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    static extern int GetLengthSid(
        IntPtr pSID
     );

    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool ConvertSidToStringSid(
        [MarshalAs(UnmanagedType.LPArray)] byte[] pSID,
        out IntPtr ptrSid
     );

    [DllImport("netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    static extern int NetApiBufferFree(
        IntPtr buffer
     );

    enum SID_NAME_USE
    {
        SidTypeUser = 1,
        SidTypeGroup,
        SidTypeDomain,
        SidTypeAlias,
        SidTypeWellKnownGroup,
        SidTypeDeletedAccount,
        SidTypeInvalid,
        SidTypeUnknown,
        SidTypeComputer
    }

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern bool LookupAccountSid(
      string lpSystemName,
      [MarshalAs(UnmanagedType.LPArray)] byte[] Sid,
      System.Text.StringBuilder lpName,
      ref uint cchName,
      System.Text.StringBuilder ReferencedDomainName,
      ref uint cchReferencedDomainName,
      out SID_NAME_USE peUse);

    [StructLayout(LayoutKind.Sequential)]
    struct SHARE_INFO_502
    {
        [MarshalAs(UnmanagedType.LPWStr)]
        public string shi502_netname;
        public uint shi502_type;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string shi502_remark;
        public Int32 shi502_permissions;
        public Int32 shi502_max_uses;
        public Int32 shi502_current_uses;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string shi502_path;
        public IntPtr shi502_passwd;
        public Int32 shi502_reserved;
        public IntPtr shi502_security_descriptor;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct ACL_SIZE_INFORMATION
    {
        public uint AceCount;
        public uint AclBytesInUse;
        public uint AclBytesFree;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct ACE_HEADER
    {
        public byte AceType;
        public byte AceFlags;
        public short AceSize;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct ACCESS_ALLOWED_ACE
    {
        public ACE_HEADER Header;
        public int Mask;
        public int SidStart;
    }

    enum ACL_INFORMATION_CLASS
    {
        AclRevisionInformation = 1,
        AclSizeInformation
    }



    static void Main(string[] args)
    {
        IntPtr bufptr = IntPtr.Zero;
        int err = NetShareGetInfo("ServerName", "ShareName", 502, out bufptr);
        if (0 == err)
        {
            SHARE_INFO_502 shareInfo = (SHARE_INFO_502)Marshal.PtrToStructure(bufptr, typeof(SHARE_INFO_502));

            bool bDaclPresent;
            bool bDaclDefaulted;
            IntPtr pAcl = IntPtr.Zero;
            GetSecurityDescriptorDacl(shareInfo.shi502_security_descriptor, out bDaclPresent, ref pAcl, out bDaclDefaulted);
            if (bDaclPresent)
            {
                ACL_SIZE_INFORMATION AclSize = new ACL_SIZE_INFORMATION();
                GetAclInformation(pAcl, ref AclSize, (uint)Marshal.SizeOf(typeof(ACL_SIZE_INFORMATION)), ACL_INFORMATION_CLASS.AclSizeInformation);
                for (int i = 0; i < AclSize.AceCount; i++)
                {
                    IntPtr pAce;
                    err = GetAce(pAcl, i, out pAce);
                    ACCESS_ALLOWED_ACE ace = (ACCESS_ALLOWED_ACE)Marshal.PtrToStructure(pAce, typeof(ACCESS_ALLOWED_ACE));

                    IntPtr iter = (IntPtr)((long)pAce + (long)Marshal.OffsetOf(typeof(ACCESS_ALLOWED_ACE), "SidStart"));
                    byte[] bSID = null;
                    int size = (int)GetLengthSid(iter);
                    bSID = new byte[size];
                    Marshal.Copy(iter, bSID, 0, size);
                    IntPtr ptrSid;
                    ConvertSidToStringSid(bSID, out ptrSid);
                    string strSID = Marshal.PtrToStringAuto(ptrSid);

                    Console.WriteLine("The details of ACE number {0} are: ", i+1);

                    StringBuilder name = new StringBuilder();
                    uint cchName = (uint)name.Capacity;
                    StringBuilder referencedDomainName = new StringBuilder();
                    uint cchReferencedDomainName = (uint)referencedDomainName.Capacity;
                    SID_NAME_USE sidUse;

                    LookupAccountSid(null, bSID, name, ref cchName, referencedDomainName, ref cchReferencedDomainName, out sidUse);

                    Console.WriteLine("Trustee Name: " + name);
                    Console.WriteLine("Domain Name: " + referencedDomainName);

                    if ((ace.Mask & 0x1F01FF) == 0x1F01FF)
                    {
                        Console.WriteLine("Permission: Full Control");
                    }
                    else if ((ace.Mask & 0x1301BF) == 0x1301BF)
                    {
                        Console.WriteLine("Permission: READ and CHANGE");
                    }
                    else if ((ace.Mask & 0x1200A9) == 0x1200A9)
                    {
                        Console.WriteLine("Permission: READ only");
                    }
                    Console.WriteLine("SID: {0} \nHeader AceType: {1} \nAccess Mask: {2} \nHeader AceFlag: {3}", strSID, ace.Header.AceType.ToString(), ace.Mask.ToString(), ace.Header.AceFlags.ToString());
                    Console.WriteLine("\n");
                }
            }
            err = NetApiBufferFree(bufptr);
        }
    }
}

REF: http://blogs.msdn.com/b/dsadsi/archive/2012/03/30/to-read-shared-permissions-of-a-server-resource-in-c-using-netsharegetinfo.aspx http://blogs.msdn.com/b/dsadsi/archive/2012/03/30/to-read-shared-permissions-of-a-server-resource-in-c-using-netsharegetinfo.aspx

另外,如果可以的话,请在另一个网络上尝试您的代码和此代码,因为我认为这是一些环境问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查共享目录权限 - C# 的相关文章

  • 使用 POST 的 HttpWebRequest 的性能

    我有一个用于测试网络服务的小工具 它可以使用 POST 或 GET 调用 Web 服务 使用POST的代码是 public void PerformRequest WebRequest webRequest WebRequest Creat
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • 如何使用T4从一个模板同时生成两个文件?

    我遇到的情况是 我需要生成两个 CSharp 代码文件 它们的代码几乎相同 但方法的输入和输出类型的命名空间不同 事实上 每个文件都针对特定国家 地区 并且类型来自特定国家 地区的 WSDL 我正在围绕服务编写一些包装器 逻辑完全相同 但从
  • 如何从经过身份验证的 SecurityToken 中获取声明

    我将令牌作为字符串传递到 SOAP 服务中 并验证了该令牌是否有效 我现在有一个 SecurityToken 在调试模式下我可以看到所有声明 特别是我想传递到另一个方法的 userId 声明 我似乎不知道如何获得这些索赔 现在 我解码了令牌
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • 托管 ODP.NET 驱动程序未显示在“数据源”对话框中

    在我的计算机上安装托管 ODP NET 后 ODP NET 托管驱动程序没有出现在里面选择数据源Visual Studio 2013 Professional 中的对话框 它应该是这样的 这就是它在我的机器上的实际外观 我已按照 轻松驱动
  • X 轴和 Z 轴上的 Quaternion.Slerp,无 Y 轴

    I am trying to rotate the Player about X Y and Z axis The Y axis should not move from last angle Example if I rotate 45
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • 使用未命名命名空间而不是静态命名空间

    我可以假设在未命名命名空间中声明的对象相当于static namespace int x 1 static int x 2 FWIK 在这两种情况下 x将具有静态存储期限和内部链接 声明为的对象的所有规则也是如此static适用于未命名名称
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • 批准后使用 jenkinsfile 构建促销

    仅当更改管理使用 servicenow 更改票证或通过手动批准批准它时 我才需要使用 jenkins 文件将我的构建升级到生产 我想要类似的东西 产品构建只有在经理批准后才能手动触发 他 她应该收到带有批准 拒绝链接的批准邮件 或者 如果与
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC

随机推荐

  • 有没有CMYK图形库?

    我正在寻找支持 CMYK 的图形库 JPG 或 TIF 我必须读取一个大图像文件和一个小图像文件 然后在第一个图像文件上写入第二个图像文件 输出也必须是 CMYK 没有任何 CMYK gt RGB 转换 有吗 C C Java 或其他 免责
  • Vagrant 错误:缺少 VT-x/AMD-V 硬件加速

    我想 起 一个流浪盒子 但我收到以下错误 VT x AMD V hardware acceleration is not available on your system Your 64 bit guest will fail to det
  • 求最小长度RLE

    经典的 RLE 算法通过使用数字来表示数字后面的字符在文本中该位置出现的次数来压缩数据 例如 AAABBAAABBCECE gt 3A2B3A2B1C1E1C1E 然而 在上面的示例中 该方法会导致压缩文本使用更多空间 更好的想法是使用数字
  • 如何通过 JavaScript 计算两个日期之间的月份和天数?

    我们使用下面的代码 var oneDay 24 60 60 1000 hours minutes seconds milliseconds var firstDate new Date 2008 01 12 var secondDate n
  • 我应该选择哪种格式在 C# 中请求 API - JSON 或 XML

    我正在从 C 中的 REST API 请求数据 API 以 JSON 和 XML 格式提供相同的数据 我应该去哪一个 它是clear https stackoverflow com questions 4596465 is parsing
  • 在 EaselJS 中缓存 SpriteSheet

    如何在 EaselJS 中缓存 SpriteSheets 我有一个 Sprite 对象 当我使用user hero cache 0 0 30 40 它停止播放动画 可能是因为我只是缓存当前帧 而不是整个 SpriteSheet 图像 那么我
  • R data.table 条件在组内,但在组中的第一个实例中记录

    我的数据看起来有点像这样 df lt data frame ID c rep 1 4 rep 2 2 rep 3 2 4 TYPE c 1 3 2 4 1 2 2 3 2 SEQUENCE c seq 1 4 1 2 1 2 1 ID TY
  • 在struts中上传一个文件和一些数据

    我想通过struts表单上传图像文件和一些数据 处理数据 并将该图像存储在数据库中 我已经为它创建了一个表单 在 struts xml 文件中定义了上传文件的操作 但是当控件采用 java 方法时 文件类型变量中的值为 null 请帮忙解决
  • 如何在 Android 中调整 PIP 模式的大小

    我正在尝试在我的应用程序中实现画中画模式 我正在 PIP 模式下实现 google 地图 但无法调整全屏地图的大小 它始终放大地图中心点 我已经进行了与此问题相关的研发 但没有找到任何正确的答案 基本上 我需要像 Whatsapp app
  • HtmlUnit 访问没有 id 或 Name 的元素

    我怎样才能访问这个元素
  • 我可以将 FlurlClient 与 Asp.Net Core TestServer 一起使用吗?

    我们在一些项目中使用 FlurlClient 并熟悉其流畅的界面 我们现在希望使用 TestServer 在 ASP NET Core 集成测试中使用它 示例来自http asp net hacker rocks 2017 09 27 te
  • 确定测试矩阵结果的有效方法

    相关问题 矩阵组合逻辑 https stackoverflow com questions 13531987 matrix combination logic 笛卡尔积是最好的方法吗 https stackoverflow com ques
  • Julia - 读取大文件的并行性

    在 Julia v1 1 中 假设我有一个非常大的文本文件 30GB 并且我想要并行 多线程 读取每一行 我该怎么办 此代码是在检查后尝试执行此操作Julia 有关多线程的文档 https docs julialang org en v1
  • 是否可以重用backgroundworker对象?

    我有一个 刷新 按钮 每次单击它时我都希望我的后台工作对象能够工作 i use if main news back worker IsBusy true Start the asynchronous operation main news
  • 在 Windows Phone 8 上创建构建

    我想为我的 Windows Phone 8 应用程序构建 如 APK 以进行测试 我该怎么办 当您在 VS 2012 中运行 Windows Phone 8 应用程序时 会在应用程序的 Bin 文件夹中创建一个 XAP 文件 它类似于And
  • 如何使用Vim快速查看Mercurial或Git的变化

    当我在 Vim 中编辑文件时 我想快速突出显示自上次提交以来所做的任何更改 同时仍然能够编辑该文件 有什么可以接近这样做吗 编辑 2020 01 23 快速搜索 仅供参考 发现还有另一个插件似乎与 VCS 无关 https github c
  • 为什么在此 AnyEvent::Handle 示例中没有调用 on_eof?

    这是我的简单服务器 当我运行它并 telnet 到它 端口 5222 并让 telnet 退出其连接时 为什么我的 on eof 函数没有被调用 IE 为什么字符串不是 CATASTROPHE 打印 usr bin perl use v5
  • 如果存在具有相同名称的方法的 Mixin,如何调用超类方法

    重复方法行为 The 代码 这里作为要点 https dartpad dartlang org 10e4a4fe0cc01c7eb5ec926ff9a4cebb将打印e 如果我删除覆盖 即删除output from Baz 它将打印w fr
  • Java PBEWithMD5AndDES

    我正在使用基于密码的加密 我最初的想法是使用 AES 来加密包含密码的文件 结果基于密码的加密不支持 AES 它使用 DES AFAIK des 并不安全 PBEWithMD5AndDES 是否足够安全 足以推送我的数据 还是我应该寻找其他
  • 检查共享目录权限 - C#

    我想编写一段代码来检查共享目录权限 我检查了多个解决方案 但在尝试获取本地目录权限时效果很好 但当我为共享目录制作测试用例时它会失败 我在这个问题中尝试举例 SOF 检查网络中的目录和文件写入权限 https stackoverflow c