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.