Crear un recurso compartido con permisos con Windows Powershell

9

Con Powershell, ¿cómo puedo crear un recurso compartido y establecer permisos de acceso?

Por ejemplo de la siguiente manera

  • Crea un recurso compartido llamado "público" que se asigna a la "ruta c: \ shares \ foo"
  • Permita que DOMAIN1 \ Users tenga acceso de solo lectura al recurso compartido (esto no significa configurar acls en los archivos, sino en el recurso compartido)
usuario2666
fuente

Respuestas:

7

Esto debería funcionar:

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

Por supuesto, deberá iniciar PowerShell con derechos administrativos, según dónde / cómo lo haga.

Matt Hanson
fuente
7

Use el método Win32_Share Create. Ejemplo:

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

Puede encontrar la documentación de este método aquí en 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:

  • Ruta: ruta local del recurso compartido de Windows. Por ejemplo, "C: \ FolderToShare".
  • Nombre: pasa el alias a una ruta configurada como recurso compartido en un sistema Windows. Ejemplo, "ShareName".
  • Tipo: pasa el tipo de recurso que se comparte. Los tipos incluyen unidades de disco, colas de impresión, comunicaciones entre procesos (IPC) y dispositivos generales. Puede ser uno de los siguientes valores.
    • 0 - Unidad de disco
    • 1 - Cola de impresión
    • 2 - Dispositivo
    • 3 - IPC
    • 2147483648 - Administrador de la unidad de disco
    • 2147483649 - Administrador de cola de impresión
    • 2147483650 - Administrador de dispositivos
    • 2147483651 - Administrador de IPC
  • MaximumAllowed: límite en el número máximo de usuarios que pueden usar este recurso simultáneamente. Ejemplo: 100. Este parámetro es opcional.
  • Descripción: comentario opcional para describir el recurso que se comparte. Este parámetro es opcional. Ejemplo: "Compartir descripción".
  • Contraseña: contraseña (cuando el servidor se ejecuta con seguridad de nivel compartido) para el recurso compartido. Si el servidor se ejecuta con seguridad de nivel de usuario, este parámetro se ignora. Este parámetro es opcional.
  • Acceso: descriptor de seguridad para permisos de nivel de usuario. Un descriptor de seguridad contiene información sobre los permisos, el propietario y las capacidades de acceso del recurso.

Consulte esta página en MSDN para obtener detalles sobre cómo establecer permisos de acceso: Clase Win32_SecurityDescriptor . Este artículo también es un buen punto de partida: Tareas de WMI: archivos y carpetas .

splattne
fuente
2

La siguiente función es un ejemplo y se puede adaptar a lo que necesite. La principal restricción es que debe ejecutarse en la máquina donde se alojará el recurso compartido (o tal vez usando PS Remoting para llegar a esa máquina primero). La cuenta que ejecuta el script también debe tener permisos suficientes para crear recursos compartidos.

Tal como está escrito, espera un DirectoryInfoobjeto como argumento, pero no sería difícil adaptarlo para cadenas. El ejemplo incluye permisos en la carpeta para dos objetos diferentes (un usuario y un grupo), cada uno con diferentes tipos de acceso, para que pueda ver cómo mezclar y combinar para requisitos de permisos complejos:

# $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}
     }
}
Joel Coel
fuente
Divulgación completa: adapté el siguiente código de una publicación encontrada en otro lugar (lamentablemente, mi PC se bloqueó y perdí el enlace, por lo que no puedo atribuirlo correctamente). Recuerdo que esta pregunta predeterminada del servidor se clasificó más arriba en mi búsqueda, por lo que quería incluir mi resultado aquí.
Joel Coel
Gracias por tu guión, pero estoy tratando de que funcione en una carpeta distante para compartir. La carpeta está en un NAS, sin ninguna interfaz de usuario para ejecutar ningún script de PowerShell. ¿Tenía una pista para que funcione en una carpeta distante?
@Badpandy donde usamos esto, tengo que ir a la máquina host para usar la secuencia de comandos, porque hay dos niveles de permisos: los permisos en el recurso compartido y los permisos en el sistema de archivos local están separados, y solo sé cómo establecer permisos en el sistema de archivos local cuando se ejecuta en la máquina local.
Joel Coel
0

Para Windows 7 intente esto:

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

Arriba también funciona desde PowerShell. Nota `antes, COMPLETO

Frank Prepsel
fuente