我想使用COM Api或WMI來更改共享文件夾中的「啓用基於訪問的枚舉」,「允許共享緩存」和「加密數據訪問」屬性。如何更新現有的共享文件夾屬性?
我以前使用Win32_Share
創建份額,但這並不具有的屬性來分配這些屬性。 但後來我才知道'MSFT_SmbShare
'的課,但我只能看到CreateShare
方法。我是在退出共享時啓用/禁用這些標誌,但無法找到任何UpdateShare
方法。
請提出一個方法來切換任何的COM API的或WMI的A股這些標誌。
我想使用COM Api或WMI來更改共享文件夾中的「啓用基於訪問的枚舉」,「允許共享緩存」和「加密數據訪問」屬性。如何更新現有的共享文件夾屬性?
我以前使用Win32_Share
創建份額,但這並不具有的屬性來分配這些屬性。 但後來我才知道'MSFT_SmbShare
'的課,但我只能看到CreateShare
方法。我是在退出共享時啓用/禁用這些標誌,但無法找到任何UpdateShare
方法。
請提出一個方法來切換任何的COM API的或WMI的A股這些標誌。
這些值似乎都屬於MSFT_SmbShare
類的屬性;具體而言,FolderEnumerationMode
,CachingMode
和EncryptData
。
更新值後,使用Put_
方法進行更新。
要更改這些設置,您可以使用NetShareSetInfo function可在Windows SDK與1005
所有的標誌都在這裏定義的級別,但要注意的文檔不會出現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的新東西(https://msdn.microsoft.com/en-us/library/windows/desktop/bb525404(v=vs.85).aspx)缺少以下標誌 SHI1005_FLAGS_ENCRYPT_DATA = 0x08000 ,//需要加密 SHI1005_FLAGS_RESERVED = 0x10000 //保留供內部使用 –
我需要一些參考或代碼來更新c#中現有共享的這三個屬性。 –