A adição de um compartilhamento em um cluster de failover com cotas ativadas leva 10 minutos

7

Eu tenho um cluster de serviço de arquivos em que um dos recursos do servidor de arquivos está hospedando ~ 50.000 diretórios base de usuários. Os diretórios base têm um modelo de cota atribuído por meio do FSRM .

Ao tentar adicionar um novo compartilhamento usando o assistente "Adicionar compartilhamento de arquivo" do Gerenciador de Cluster de Failover, ele começa recuperando todas as cotas de todas as pastas compartilhadas sobre todos os recursos de cluster de servidor de arquivos definidos. O que leva cerca de 10 minutos neste ambiente.

Como eu poderia

  • acelere o processo de enumeração de cotas
  • limita o processo de enumeração de cota a apenas um recurso de cluster de servidor de arquivos
  • desative completamente a enumeração de cota para o Assistente de novo compartilhamento

?

    
por the-wabbit 17.12.2015 / 12:50

1 resposta

3

Eu finalmente trabalhei em torno do problema, levantando o requisito para usar a GUI para criação de compartilhamento de arquivos inteiramente. Em vez disso, documentei o uso do New-SmbShare como o procedimento de criação de compartilhamento. Adicionar compartilhamentos dessa maneira ignora todas as verificações de pré-configuração que o assistente da GUI está executando, incluindo a enumeração de cota.

New-SmbShare -Name <ShareName> -ScopeName "<CAPName>" -Path "<LocalDirectoryToBeShared>" -FullAccess "Everyone" -Description "<Comment>"

O New-SmbShare cmdlet foi introduzido no Servidor 2012 R2 / Windows 8.1. Para clusters de servidor de arquivos da versão anterior (2012, 2008R2, 2008), você pode emprestar a classe NativeMethods com a qual está importando o NetShareAdd de Netapi32.dll de um script publicado junto com um Publicação do blog MSDN sobre compartilhamentos nos escopos do Cluster do Fileover .

Minha versão significativamente reduzida se parece com isso:

#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

O uso é trivial:

[NativeMethods]::ShareFolder("<CAPname>", "<ShareName>", "<LocalDirectoryToBeShared>", "<Comment>")

A função ShareFolder retorna 0 após a execução bem-sucedida e termina instantaneamente, mesmo com cotas ativadas. Para ser executado em um dos nós do cluster que hospeda o recurso do servidor CAP / file. Talvez seja necessário consertar ACLs de compartilhamento posteriormente, pois a ACL de criação de compartilhamento padrão é apenas Everyone:Read e não pode ser especificada com esse método.

    
por 22.12.2015 / 13:16