使用ABE以编程方式创建共享文件夹

PaX

我正在远程计算机/服务器上创建一个共享文件夹,并且可以正常工作,但是无法找到是否可以更改共享设置。我希望能够关闭“允许共享缓存”并打开基于Access的枚举,但无法在此处以及通过搜索google找到任何相关信息。有人知道C#是否可以实现吗?

我用来创建共享的代码是:

public static void CreateRemoteShare(string servername, string FolderPath, string ShareName, string Description)
    {
        try
        {
            string scope = string.Format("\\\\{0}\\root\\cimv2", servername);

            ManagementScope ms = new ManagementScope(scope);

            ManagementClass managementClass = new ManagementClass("Win32_Share");
            managementClass.Scope = ms;                
            ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
            ManagementBaseObject outParams;

            inParams["Description"] = Description;
            inParams["Name"] = ShareName;
            inParams["Path"] = FolderPath;
            inParams["Type"] = 0x0;                

            NTAccount everyoneAccount = new NTAccount(null, "EVERYONE");
            SecurityIdentifier sid = (SecurityIdentifier)everyoneAccount.Translate(typeof(SecurityIdentifier));
            byte[] sidArray = new byte[sid.BinaryLength];
            sid.GetBinaryForm(sidArray, 0);

            ManagementObject everyone = new ManagementClass("Win32_Trustee");
            everyone["Domain"] = null;
            everyone["Name"] = "EVERYONE";
            everyone["SID"] = sidArray;

            ManagementObject dacl = new ManagementClass("Win32_Ace");
            dacl["AccessMask"] = 2032127;
            dacl["AceFlags"] = 3;
            dacl["AceType"] = 0;
            dacl["Trustee"] = everyone;

            ManagementObject securityDescriptor = new ManagementClass("Win32_SecurityDescriptor");
            securityDescriptor["ControlFlags"] = 4; //SE_DACL_PRESENT 
            securityDescriptor["DACL"] = new object[] { dacl };

            inParams["Access"] = securityDescriptor;

            outParams = managementClass.InvokeMethod("Create", inParams, null);

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);                
        }
    }

如果有人知道有什么办法可以做到,那我将永远幸福。

PaX

在仔细研究了这一点之后,我发现了一个包含在PowerShell中执行此操作的方法的站点,并从该站点中将其添加到了我的C#代码中。该站点是:ABE Powershell

提取的结果代码如下:

public enum Share_Type : uint
    {
        STYPE_DISKTREE = 0x00000000,   // Disk Drive
        STYPE_PRINTQ = 0x00000001,   // Print Queue
        STYPE_DEVICE = 0x00000002,   // Communications Device
        STYPE_IPC = 0x00000003,   // InterProcess Communications
        STYPE_SPECIAL = 0x80000000,   // Special share types (C$, ADMIN$, IPC$, etc)
        STYPE_TEMPORARY = 0x40000000   // Temporary share 
    }

    public enum Share_ReturnValue : int
    {
        NERR_Success = 0,
        ERROR_ACCESS_DENIED = 5,
        ERROR_NOT_ENOUGH_MEMORY = 8,
        ERROR_INVALID_PARAMETER = 87,
        ERROR_INVALID_LEVEL = 124, // unimplemented level for info
        ERROR_MORE_DATA = 234,
        NERR_BufTooSmall = 2123, // The API return buffer is too small.
        NERR_NetNameNotFound = 2310 // This shared resource does not exist.
    }

    [System.Flags]
    public enum Shi1005_flags
    {
        SHI1005_FLAGS_DFS = 0x0001,  // Part of a DFS tree (Cannot be set)
        SHI1005_FLAGS_DFS_ROOT = 0x0002,  // Root of a DFS tree (Cannot be set)
        SHI1005_FLAGS_RESTRICT_EXCLUSIVE_OPENS = 0x0100,  // Disallow Exclusive file open
        SHI1005_FLAGS_FORCE_SHARED_DELETE = 0x0200,  // Open files can be force deleted
        SHI1005_FLAGS_ALLOW_NAMESPACE_CACHING = 0x0400,  // Clients can cache the namespace
        SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM = 0x0800,  // Only directories for which a user has FILE_LIST_DIRECTORY will be listed
        SHI1005_FLAGS_FORCE_LEVELII_OPLOCK = 0x1000,  // Prevents exclusive caching
        SHI1005_FLAGS_ENABLE_HASH = 0x2000,  // Used for server side support for peer caching
        SHI1005_FLAGS_ENABLE_CA = 0X4000   // Used for Clustered shares
    }

    public static class NetApi32
    {

        // ********** Structures **********

        // SHARE_INFO_502
        [StructLayout(LayoutKind.Sequential)]
        public 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;
        }

        // SHARE_INFO_1005
        [StructLayout(LayoutKind.Sequential)]
        public struct SHARE_INFO_1005
        {
            public Int32 Shi1005_flags;
        }



        private class unmanaged
        {

            //NetShareGetInfo
            [DllImport("Netapi32.dll", SetLastError = true)]
            internal static extern int NetShareGetInfo(
                [MarshalAs(UnmanagedType.LPWStr)] string serverName,
                [MarshalAs(UnmanagedType.LPWStr)] string netName,
                Int32 level,
                ref IntPtr bufPtr
            );

            [DllImport("Netapi32.dll", SetLastError = true)]
            public extern static Int32 NetShareSetInfo(
                [MarshalAs(UnmanagedType.LPWStr)] string servername,
                [MarshalAs(UnmanagedType.LPWStr)] string netname, Int32 level, IntPtr bufptr, out Int32 parm_err);


        }

        // ***** Functions *****
        public static SHARE_INFO_502 NetShareGetInfo_502(string ServerName, string ShareName)
        {
            Int32 level = 502;
            IntPtr lShareInfo = IntPtr.Zero;
            SHARE_INFO_502 shi502_Info = new SHARE_INFO_502();
            Int32 result = unmanaged.NetShareGetInfo(ServerName, ShareName, level, ref lShareInfo);
            if ((Share_ReturnValue)result == Share_ReturnValue.NERR_Success)
            {
                shi502_Info = (SHARE_INFO_502)Marshal.PtrToStructure(lShareInfo, typeof(SHARE_INFO_502));
            }
            else
            {
                throw new Exception("Unable to get 502 structure.  Function returned: " + (Share_ReturnValue)result);
            }
            return shi502_Info;
        }

        public static SHARE_INFO_1005 NetShareGetInfo_1005(string ServerName, string ShareName)
        {
            Int32 level = 1005;
            IntPtr lShareInfo = IntPtr.Zero;
            SHARE_INFO_1005 shi1005_Info = new SHARE_INFO_1005();
            Int32 result = unmanaged.NetShareGetInfo(ServerName, ShareName, level, ref lShareInfo);
            if ((Share_ReturnValue)result == Share_ReturnValue.NERR_Success)
            {
                shi1005_Info = (SHARE_INFO_1005)Marshal.PtrToStructure(lShareInfo, typeof(SHARE_INFO_1005));
            }
            else
            {
                throw new Exception("Unable to get 1005 structure.  Function returned: " + (Share_ReturnValue)result);
            }
            return shi1005_Info;
        }

        public static int NetShareSetInfo_1005(string ServerName, string ShareName, SHARE_INFO_1005 shi1005_Info) //  Int32 Shi1005_flags
        {
            Int32 level = 1005;
            Int32 err;

            IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(shi1005_Info));
            Marshal.StructureToPtr(shi1005_Info, ptr, false);

            var result = unmanaged.NetShareSetInfo(ServerName, ShareName, level, ptr, out err);

            return result;
        }

    }


    static void Main(string[] args)
    {
        abeTest();
    }        

    public static void abeTest()
    {            
        NetApi32.SHARE_INFO_1005 test = new NetApi32.SHARE_INFO_1005();
        test.Shi1005_flags = 2048;
        NetApi32.NetShareSetInfo_1005("FileStore2", "TestShare2$", test);
    }

通过将此代码与上面的代码结合起来,您可以创建共享并设置基于访问的枚举。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

以编程方式创建共享文件夹 c#

来自分类Dev

在SharePoint 2013中以编程方式创建文件夹

来自分类Dev

在MeteorJS中以编程方式创建本地文件夹

来自分类Dev

无法以编程方式创建文件夹

来自分类Dev

以编程方式创建名称基于值的文件夹

来自分类Dev

以编程方式获取文件夹位置

来自分类Dev

以编程方式更改文件夹名称

来自分类Dev

如何以编程方式在Dropbox中共享照片,文件夹等?(iOS)

来自分类Dev

以编程方式为Windows中的文件夹创建快捷方式

来自分类Dev

创建文件夹共享参考

来自分类Dev

如何创建共享文件夹

来自分类Dev

如何以编程方式在Windows Phone 8中创建相册文件夹

来自分类Dev

在Windows Phone 8 / 8.1中以编程方式创建文件夹/目录

来自分类Dev

如何指定以编程方式创建的文件夹属于哪个所有者/组

来自分类Dev

如何以编程方式在Windows Phone 8中创建相册文件夹

来自分类Dev

如何以编程方式在 Outlook 中创建全局地址列表文件夹?

来自分类Dev

以编程方式删除Docker容器中的文件/文件夹

来自分类Dev

以编程方式获取存储我的财富文件的文件夹

来自分类Dev

如何使用NFS共享文件夹?

来自分类Dev

使用ironpython共享文件夹

来自分类Dev

如何使用NFS共享文件夹?

来自分类Dev

使用ironpython共享文件夹

来自分类Dev

如何确定应用程序将以编程方式使用的原始布局文件夹

来自分类Dev

如何使用Backload以编程方式更改上载文件夹

来自分类Dev

如何以编程方式(使用PowerShell,WMI等)查找和打开文件夹的先前版本?

来自分类Dev

如何确定应用程序将以编程方式使用的原始布局文件夹

来自分类Dev

如何以编程方式从mipmap文件夹加载图像?

来自分类Dev

以编程方式获取文件夹的上次编辑时间

来自分类Dev

以编程方式从Camera文件夹获取图像

Related 相关文章

  1. 1

    以编程方式创建共享文件夹 c#

  2. 2

    在SharePoint 2013中以编程方式创建文件夹

  3. 3

    在MeteorJS中以编程方式创建本地文件夹

  4. 4

    无法以编程方式创建文件夹

  5. 5

    以编程方式创建名称基于值的文件夹

  6. 6

    以编程方式获取文件夹位置

  7. 7

    以编程方式更改文件夹名称

  8. 8

    如何以编程方式在Dropbox中共享照片,文件夹等?(iOS)

  9. 9

    以编程方式为Windows中的文件夹创建快捷方式

  10. 10

    创建文件夹共享参考

  11. 11

    如何创建共享文件夹

  12. 12

    如何以编程方式在Windows Phone 8中创建相册文件夹

  13. 13

    在Windows Phone 8 / 8.1中以编程方式创建文件夹/目录

  14. 14

    如何指定以编程方式创建的文件夹属于哪个所有者/组

  15. 15

    如何以编程方式在Windows Phone 8中创建相册文件夹

  16. 16

    如何以编程方式在 Outlook 中创建全局地址列表文件夹?

  17. 17

    以编程方式删除Docker容器中的文件/文件夹

  18. 18

    以编程方式获取存储我的财富文件的文件夹

  19. 19

    如何使用NFS共享文件夹?

  20. 20

    使用ironpython共享文件夹

  21. 21

    如何使用NFS共享文件夹?

  22. 22

    使用ironpython共享文件夹

  23. 23

    如何确定应用程序将以编程方式使用的原始布局文件夹

  24. 24

    如何使用Backload以编程方式更改上载文件夹

  25. 25

    如何以编程方式(使用PowerShell,WMI等)查找和打开文件夹的先前版本?

  26. 26

    如何确定应用程序将以编程方式使用的原始布局文件夹

  27. 27

    如何以编程方式从mipmap文件夹加载图像?

  28. 28

    以编程方式获取文件夹的上次编辑时间

  29. 29

    以编程方式从Camera文件夹获取图像

热门标签

归档