2016-12-02 16 views
6

COM ApiまたはWMIを使用して、共有フォルダの「アクセスベースの列挙を有効にする」、「共有のキャッシュを許可する」および「データアクセスを暗号化する」属性を変更します。既存の共有フォルダの属性を更新するには?

Advance Share Configuration

私は以前に共有を作成するWin32_Shareを使用していたが、これは、これらの属性を割り当てる性質を持っていません。 しかし、私は 'MSFT_SmbShare'クラスについて知りたかったが、私はCreateShareメソッドしか見ることができない。私は終了共有でこれらのフラグを有効/無効にしていましたが、UpdateShareメソッドを見つけることができませんでした。

MSFT_SmbShare class

COM APIのか、WMIのいずれかによって共有にこれらのフラグを切り替えるための方法を提案してください。

答えて

1

これらの値はすべてMSFT_SmbShareクラスのプロパティと思われます。具体的にはFolderEnumerationMode,CachingMode,EncryptDataである。

値を更新したら、Put_メソッドを使用して更新してください。これらの設定を変更するには

+0

私はC#から既存の共有上のこれらの3つの属性を更新するための参照やコードが必要です。 –

7

、あなたは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); 
    } 
} 

は、Windows APIを取得するP /呼び出しを使用しています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, 
} 
+0

このコードを使用してお知らせします。手伝ってくれてありがとう。 –

+0

ありがとうございました。 MSDN(https://msdn.microsoft.com/en-us/library/windows/desktop/bb525404(v=vs.85).aspx)がフラグに続いて見つからないことを知りました。 SHI1005_FLAGS_ENCRYPT_DATA = 0x08000 、//暗号化を要求する SHI1005_FLAGS_RESERVED = 0x10000 //内部使用のために予約済み –

関連する問題