ファイルサービスのリソースの1つが〜50,000ユーザーのホームディレクトリをホストしているファイルサービスクラスターがあります。 [〜#〜] fsrm [〜#〜] によって割り当てられたクォータテンプレートがホームディレクトリにあります。
フェールオーバークラスターマネージャーの「ファイル共有の追加」ウィザードを使用して新しい共有を追加しようとすると、最初に、定義されたすべての共有フォルダーのすべてのクォータを取得しますファイルサーバークラスターリソース。この環境では、約10分かかります。
どうすれば
?
私はついに、ファイル共有の作成にGUIを使用するという要件を完全に解除することで、この問題を回避しました。代わりに、共有作成手順としてのNew-SmbShareの使用について説明しました。この方法で共有を追加すると、クォータの列挙を含め、GUIウィザードが実行しているすべての事前構成チェックがバイパスされます。
New-SmbShare -Name <ShareName> -ScopeName "<CAPName>" -Path "<LocalDirectoryToBeShared>" -FullAccess "Everyone" -Description "<Comment>"
New-SmbShare
コマンドレット は、Server 2012 R2/Windows 8.1で導入されました。以前の(2012、2008R2、2008)バージョンのファイルサーバークラスターの場合、 NetShareAdd 関数をNetapi32.dllからインポートするNativeMethods
クラスを借りることができます スクリプトFileover Clusterスコープの共有に関するMSDNブログ投稿 とともに公開されます。
私の大幅に短縮されたバージョンは次のようになります。
#Using Win32 API NetShareAdd via p/invoke to be able to specify the scope in SHARE_INFO_503
$signature = @"
using System;
using System.Runtime.InteropServices;
using System.Collections;
public class NativeMethods
{
[DllImport("Netapi32.dll")]
public static extern uint NetShareAdd([MarshalAs(UnmanagedType.LPWStr)] string strServer, Int32 dwLevel, ref SHARE_INFO_503 buf, out uint parm_err);
[StructLayoutAttribute(LayoutKind.Sequential)]
struct SECURITY_DESCRIPTOR {
public byte revision;
public byte size;
public short control;
public IntPtr owner;
public IntPtr group;
public IntPtr sacl;
public IntPtr dacl;
}
public enum SHARE_TYPE : uint
{
STYPE_DISKTREE = 0,
STYPE_PRINTQ = 1,
STYPE_DEVICE = 2,
STYPE_IPC = 3,
STYPE_SPECIAL = 0x80000000
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SHARE_INFO_503
{
public string shi503_netname;
[MarshalAs(UnmanagedType.U4)]
public SHARE_TYPE shi503_type;
public string shi503_remark;
[MarshalAs(UnmanagedType.U4)]
public int shi503_permissions;
[MarshalAs(UnmanagedType.U4)]
public int shi503_max_uses;
[MarshalAs(UnmanagedType.U4)]
public int shi503_current_uses;
public string shi503_path;
public string shi503_passwd;
public string shi503_servername;
[MarshalAs(UnmanagedType.U4)]
public int shi503_reserved;
public IntPtr shi503_security_descriptor;
}
public static uint ShareFolder(string servername, string sharename, string path, string remark)
{
SHARE_INFO_503 shInfo = new SHARE_INFO_503();
shInfo.shi503_netname = sharename;
shInfo.shi503_type = SHARE_TYPE.STYPE_DISKTREE;
shInfo.shi503_remark = remark;
shInfo.shi503_permissions = 0;
shInfo.shi503_max_uses = -1;
shInfo.shi503_current_uses = 0;
shInfo.shi503_path = path;
shInfo.shi503_passwd = null;
shInfo.shi503_servername = servername;
shInfo.shi503_reserved = 0;
shInfo.shi503_security_descriptor = IntPtr.Zero;
uint nRetValue = 0;
uint param_err = 0;
nRetValue = NetShareAdd(servername, 503, ref shInfo, out param_err);
//Console.WriteLine("Sharing " + path + " on " + servername + " as " + sharename + " returned " + nRetValue + " (" + param_err+ ")");
return nRetValue;
}
}
"@
#Import the FailoverClusters PowerShell module if it is not already imported
Import-Module FailoverClusters
#Add the function type that will be used to share the folder in the defined scope
Add-Type -TypeDefinition $signature
使い方は簡単です:
[NativeMethods]::ShareFolder("<CAPname>", "<ShareName>", "<LocalDirectoryToBeShared>", "<Comment>")
ShareFolder
関数は、正常に実行されると0を返し、クォータが有効になっている場合でも即座に終了します。 CAP /ファイルサーバーリソースをホストしているクラスターノードの1つで実行されます。デフォルトの共有作成ACLはEveryone:Read
であり、このメソッドでは指定できないため、後で共有ACLを修正する必要がある場合があります。