Criando um compartilhamento com permissões com o Windows Powershell


9

Usando o Powershell, como posso criar um compartilhamento e definir permissões de acesso.

Por exemplo, como segue

  • Crie um compartilhamento chamado "public" que mapeie para o "caminho c: \ shares \ foo"
  • Permitir que DOMAIN1 \ Users tenha acesso somente leitura ao compartilhamento (isso não significa definir acls nos arquivos, mas no compartilhamento)

Respostas:


7

Isso deve fazer o truque:

net share "Public=c:\shares\foo" "/GRANT:Users,READ"

Obviamente, você precisará iniciar o PowerShell com direitos administrativos, dependendo de onde / como está fazendo isso.


7

Use o método Win32_Share Create. Exemplo:

(Get-WmiObject -List -ComputerName . | Where-Object -FilterScript 
{$_.Name -eq "Win32_Share"}).InvokeMethod("Create",
   ("C:\FolderToShare","ShareName",0,100,"Share description"))

Você pode encontrar a documentação deste método aqui no MSDN .

uint32 Create(
  [in]  string Path,
  [in]  string Name,
  [in]  uint32 Type,
  [in]  uint32 MaximumAllowed,
  [in]  string Description,
  [in]  string Password,
  [in]  Win32_SecurityDescriptor Access
);

Parâmetros:

  • Caminho - Caminho local do compartilhamento do Windows. Por exemplo, "C: \ FolderToShare".
  • Nome - passa o alias para um caminho configurado como um compartilhamento em um sistema Windows. Exemplo, "ShareName".
  • Tipo - passa o tipo de recurso que está sendo compartilhado. Os tipos incluem unidades de disco, filas de impressão, comunicações entre processos (IPC) e dispositivos gerais. Pode ser um dos seguintes valores.
    • 0 - Unidade de disco
    • 1 - Fila de impressão
    • 2 - Dispositivo
    • 3 - IPC
    • 2147483648 - Administrador da unidade de disco
    • 2147483649 - Admin da fila de impressão
    • 2147483650 - Administrador do dispositivo
    • 2147483651 - administrador do IPC
  • MaximumAllowed - limite no número máximo de usuários com permissão para usar simultaneamente esse recurso. Exemplo: 100. Este parâmetro é opcional.
  • Descrição - comentário opcional para descrever o recurso que está sendo compartilhado. Este parâmetro é opcional. Exemplo: "Compartilhar descrição".
  • Senha - Senha (quando o servidor está sendo executado com segurança em nível de compartilhamento) para o recurso compartilhado. Se o servidor estiver executando com segurança no nível do usuário, esse parâmetro será ignorado. Este parâmetro é opcional.
  • Acesso - Descritor de segurança para permissões no nível do usuário. Um descritor de segurança contém informações sobre as permissões, proprietário e recursos de acesso do recurso.

Consulte esta página no MSDN para obter detalhes sobre como definir permissões de acesso: Classe Win32_SecurityDescriptor . Este artigo também é um bom ponto de partida: Tarefas WMI: arquivos e pastas .


2

A função abaixo é um exemplo e pode ser adaptada para o que você precisar. A principal restrição é que ele deve ser executado na máquina em que o compartilhamento deve ser hospedado (ou talvez usando o PS Remoting para alcançar a máquina primeiro). A conta que está executando o script também deve ter permissões suficientes para criar compartilhamentos.

Conforme escrito, ele espera um DirectoryInfoobjeto como argumento, mas não seria difícil adaptá-lo a strings. O exemplo inclui permissões na pasta para dois objetos diferentes (um usuário e um grupo), cada um com diferentes tipos de acesso, para que você possa ver como combinar e combinar requisitos complexos de permissão:

# $folder is a DirectoryInfo object
Function Create-FileShare($folder)
{
    $name = $folder.Name
    $path = $folder.FullName
    $description = "$name"
    $domain = "example.com" #AD Domain name here (Optional/Not really used/Here for completeness)

    $Method = "Create"
    $sd = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()

    #AccessMasks:
    #2032127 = Full Control
    #1245631 = Change
    #1179817 = Read

    #Share with the user
    $ACE = ([WMIClass] "Win32_ACE").CreateInstance()
    $Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
    $Trustee.Name = $name
    $Trustee.Domain = $Null
    #original example assigned this, but I found it worked better if I left it empty
    #$Trustee.SID = ([wmi]"win32_userAccount.Domain='$domain',Name='$name'").sid    
    $ace.AccessMask = 1245631 
    $ace.AceFlags = 3 #Should almost always be three. Really. don't change it.
    $ace.AceType = 0 # 0 = allow, 1 = deny
    $ACE.Trustee = $Trustee 
    $sd.DACL += $ACE.psObject.baseobject 

    #Share with Domain Admins
    $ACE = ([WMIClass] "Win32_ACE").CreateInstance()
    $Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
    $Trustee.Name = "Domain Admins"
    $Trustee.Domain = $Null
    #$Trustee.SID = ([wmi]"win32_userAccount.Domain='$domain',Name='$name'").sid    
    $ace.AccessMask = 2032127
    $ace.AceFlags = 3
    $ace.AceType = 0
    $ACE.Trustee = $Trustee 
    $sd.DACL += $ACE.psObject.baseobject        

    $mc = [WmiClass]"Win32_Share"
    $InParams = $mc.psbase.GetMethodParameters($Method)
    $InParams.Access = $sd
    $InParams.Description = $description
    $InParams.MaximumAllowed = $Null
    $InParams.Name = $name
    $InParams.Password = $Null
    $InParams.Path = $path
    $InParams.Type = [uint32]0

    $R = $mc.PSBase.InvokeMethod($Method, $InParams, $Null)
    switch ($($R.ReturnValue))
     {
          0 {Write-Host "Share:$name Path:$path Result:Success"; break}
          2 {Write-Host "Share:$name Path:$path Result:Access Denied" -foregroundcolor red -backgroundcolor yellow;break}
          8 {Write-Host "Share:$name Path:$path Result:Unknown Failure" -foregroundcolor red -backgroundcolor yellow;break}
          9 {Write-Host "Share:$name Path:$path Result:Invalid Name" -foregroundcolor red -backgroundcolor yellow;break}
          10 {Write-Host "Share:$name Path:$path Result:Invalid Level" -foregroundcolor red -backgroundcolor yellow;break}
          21 {Write-Host "Share:$name Path:$path Result:Invalid Parameter" -foregroundcolor red -backgroundcolor yellow;break}
          22 {Write-Host "Share:$name Path:$path Result:Duplicate Share" -foregroundcolor red -backgroundcolor yellow;break}
          23 {Write-Host "Share:$name Path:$path Result:Reedirected Path" -foregroundcolor red -backgroundcolor yellow;break}
          24 {Write-Host "Share:$name Path:$path Result:Unknown Device or Directory" -foregroundcolor red -backgroundcolor yellow;break}
          25 {Write-Host "Share:$name Path:$path Result:Network Name Not Found" -foregroundcolor red -backgroundcolor yellow;break}
          default {Write-Host "Share:$name Path:$path Result:*** Unknown Error ***" -foregroundcolor red -backgroundcolor yellow;break}
     }
}

Divulgação completa: adaptei o código a seguir em uma postagem encontrada em outro lugar (infelizmente, meu PC travou e perdi o link, por isso não posso atribuir corretamente). Lembro-me de que essa questão de falha no servidor foi classificada mais alta na minha pesquisa e, portanto, queria incluir meu resultado aqui.
Joel Coel

Obrigado pelo seu script, mas estou tentando fazê-lo funcionar em uma pasta distante para compartilhar. A pasta está em um NAS, sem nenhuma interface do usuário para executar qualquer script do PowerShell. Você tinha uma pista para fazê-lo funcionar em uma pasta distante?

@Badpandy, onde usamos isso, tenho que fazer rdp na máquina host para usar o script, porque existem dois níveis de permissão: as permissões no compartilhamento e as permissões no sistema de arquivos local são separadas e só sei definir permissões no sistema de arquivos local ao executar na máquina local.
Joel Coel # 03

0

Para o Windows 7, tente o seguinte:

net SHARE share=d:\share /GRANT:EVERYONE`,FULL /REMARK:"

Acima também funciona no PowerShell. Observe `antes, COMPLETO

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.