【问题标题】:How to update existing share folder attributes?如何更新现有的共享文件夹属性?
【发布时间】:2016-12-02 10:18:26
【问题描述】:

我想使用 COM Api 或 WMI 更改共享文件夹上的“启用基于访问的枚举”、“允许缓存共享”和“加密数据访问”属性。

我之前使用Win32_Share 创建共享,但它没有分配这些属性的属性。 但后来我知道了 'MSFT_SmbShare' 类,但我只能看到 CreateShare 方法。我要在退出共享时启用/禁用这些标志,但找不到任何 UpdateShare 方法。

MSFT_SmbShare class

请建议一种方法,以通过任何 COM API 或 WMI 在共享上切换这些标志。

【问题讨论】:

    标签: c# .net com wmi


    【解决方案1】:

    要更改这些设置,您可以使用级别为 1005 的 Windows SDK 中的NetShareSetInfo function

    此处定义了所有标志,但请注意,文档并未显示 SHI1005_FLAGS_ENCRYPT_DATA (0x08000),它确实在相应的 Windows 头文件 LMERR.H 中。

    这是一个示例,演示如何在 C# 控制台应用程序中使用它:

    class Program
    {
        static void Main(string[] args)
        {
            // get flags of "myshare" share
            var flags = NetShareUtilities.Get1005Flags(null, "myshare");
    
            // add the "Require encryption" flag
            flags |= SHI1005_FLAGS.SHI1005_FLAGS_ENCRYPT_DATA;
    
            // save flags (you'll need to have admin rights for this)
            NetShareUtilities.Set1005Flags(null, "myshare", flags);
        }
    }
    

    这是使用 P/Invoke 访问 Windows API 的 NetShareUtilities 类:

    public static class NetShareUtilities
    {
        [DllImport("netapi32.dll")]
        private extern static int NetShareSetInfo([MarshalAs(UnmanagedType.LPWStr)] string servername, [MarshalAs(UnmanagedType.LPWStr)] string netname, int level, ref SHI1005_FLAGS buf, IntPtr parm_err);
    
        [DllImport("netapi32.dll")]
        private extern static int NetShareGetInfo([MarshalAs(UnmanagedType.LPWStr)] string servername, [MarshalAs(UnmanagedType.LPWStr)] string netname, int level, out IntPtr bufptr);
    
        [DllImport("netapi32.dll")]
        private static extern IntPtr NetApiBufferFree(IntPtr Buffer);
    
        public static SHI1005_FLAGS Get1005Flags(string serverName, string name)
        {
            IntPtr ptr;
            int err = NetShareGetInfo(serverName, name, 1005, out ptr);
            if (err != 0)
                throw new Win32Exception(err);
    
            var flags = (SHI1005_FLAGS)Marshal.ReadInt32(ptr);
            NetApiBufferFree(ptr);
            return flags;
        }
    
        public static void Set1005Flags(string serverName, string name, SHI1005_FLAGS flags)
        {
            // note: you need to have enough rights to call this
            int err = NetShareSetInfo(serverName, name, 1005, ref flags, IntPtr.Zero);
            if (err != 0)
                throw new Win32Exception(err);
        }
    }
    
    [Flags]
    public enum SHI1005_FLAGS
    {
        // note: all values are taken from LMERR.H
        SHI1005_FLAGS_DFS = 0x0001,
        SHI1005_FLAGS_DFS_ROOT = 0x0002,
    
        // these 3 ones are not strict flags, you'll need to use a mask as specified in the official documentation
        CSC_CACHE_AUTO_REINT = 0x0010,
        CSC_CACHE_VDO = 0x0020,
        CSC_CACHE_NONE = 0x0030,
    
        SHI1005_FLAGS_RESTRICT_EXCLUSIVE_OPENS = 0x00100,
        SHI1005_FLAGS_FORCE_SHARED_DELETE = 0x00200,
        SHI1005_FLAGS_ALLOW_NAMESPACE_CACHING = 0x00400,
        SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM = 0x00800,
        SHI1005_FLAGS_FORCE_LEVELII_OPLOCK = 0x01000,
        SHI1005_FLAGS_ENABLE_HASH = 0x02000,
        SHI1005_FLAGS_ENABLE_CA = 0x04000,
        SHI1005_FLAGS_ENCRYPT_DATA = 0x08000,
        SHI1005_FLAGS_RESERVED = 0x10000,
    }
    

    【讨论】:

    • 我将使用此代码并让您知道。感谢您的帮助。
    • 感谢它的工作。新发现MSDN (msdn.microsoft.com/en-us/library/windows/desktop/…) 缺少以下标志 SHI1005_FLAGS_ENCRYPT_DATA = 0x08000,// 需要加密 SHI1005_FLAGS_RESERVED = 0x10000 // 保留供内部使用
    【解决方案2】:

    这些值似乎都是MSFT_SmbShare 类的属性;具体来说,FolderEnumerationModeCachingModeEncryptData

    更新值后,使用Put_方法更新。

    【讨论】:

    • 我需要一些参考或代码来从 c# 更新现有共享上的这三个属性。
    猜你喜欢
    • 1970-01-01
    • 2020-10-06
    • 2016-10-18
    • 2011-10-09
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    相关资源
    最近更新 更多