Creazione di una condivisione con autorizzazioni con Windows Powershell


9

Utilizzando Powershell come posso creare una condivisione e impostare le autorizzazioni di accesso.

Ad esempio come segue

  • Crea una condivisione denominata "pubblica" che si associa al "percorso c: \ share \ foo"
  • Consenti a DOMAIN1 \ Users di accedere in sola lettura alla condivisione (ciò non significa impostare acls sui file, piuttosto sulla condivisione)

Risposte:


7

Questo dovrebbe fare il trucco:

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

Ovviamente, dovrai avviare PowerShell con diritti amministrativi, a seconda di dove / come lo stai facendo.


7

Utilizzare il metodo di creazione Win32_Share. Esempio:

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

Puoi trovare la documentazione di questo metodo qui su 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
);

parametri:

  • Percorso: percorso locale della condivisione di Windows. Ad esempio, "C: \ FolderToShare".
  • Nome: passa l'alias a un percorso impostato come condivisione su un sistema Windows. Esempio, "ShareName".
  • Tipo: passa il tipo di risorsa condivisa. I tipi includono unità disco, code di stampa, comunicazioni tra processi (IPC) e dispositivi generali. Può essere uno dei seguenti valori.
    • 0 - Unità disco
    • 1 - Coda di stampa
    • 2 - Dispositivo
    • 3 - IPC
    • 2147483648 - Amministrazione unità disco
    • 2147483649 - Amministratore coda di stampa
    • 2147483650 - Amministratore dispositivo
    • 2147483651 - Amministratore IPC
  • MaximumAllowed: limite al numero massimo di utenti autorizzati a utilizzare questa risorsa contemporaneamente. Esempio: 100. Questo parametro è facoltativo.
  • Descrizione: commento facoltativo per descrivere la risorsa condivisa. Questo parametro è facoltativo. Esempio: "Condividi descrizione".
  • Password: password (quando il server è in esecuzione con sicurezza a livello di condivisione) per la risorsa condivisa. Se il server è in esecuzione con sicurezza a livello di utente, questo parametro viene ignorato. Questo parametro è facoltativo.
  • Accesso: descrittore di sicurezza per le autorizzazioni a livello di utente. Un descrittore di sicurezza contiene informazioni su autorizzazioni, proprietario e capacità di accesso della risorsa.

Vedi questa pagina su MSDN per i dettagli su come impostare le autorizzazioni di accesso: Win32_SecurityDescriptor Class . Questo articolo è anche un buon punto di partenza: Attività WMI: file e cartelle .


2

La funzione di seguito è un esempio e può essere adattata a tutto ciò di cui hai bisogno. La restrizione principale è che deve essere eseguito sulla macchina in cui deve essere ospitata la condivisione (o forse utilizzando PS Remoting per raggiungere prima quella macchina). L'account che esegue lo script deve inoltre disporre di autorizzazioni sufficienti per creare condivisioni.

Come scritto, si aspetta un DirectoryInfooggetto come argomento, ma non sarebbe difficile adattarlo alle stringhe. L'esempio include le autorizzazioni per la cartella per due oggetti diversi (un utente e un gruppo), ognuno con diversi tipi di accesso, in modo da poter vedere come combinare e abbinare requisiti di autorizzazione complessi:

# $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}
     }
}

Divulgazione completa: ho adattato il seguente codice da un post trovato altrove (purtroppo il mio PC si è bloccato e ho perso il collegamento, quindi non posso attribuire correttamente). Ricordo che questa domanda serverfault era classificata più in alto nella mia ricerca, e quindi volevo includere il mio risultato qui.
Joel Coel,

Grazie per il tuo script, ma sto cercando di farlo funzionare su una cartella distante da condividere. La cartella si trova su un NAS, senza alcuna interfaccia utente per eseguire qualsiasi script PowerShell. Hai avuto un indizio per farlo funzionare su una cartella distante?

@Badpandy dove lo usiamo, devo rdp sul computer host per usare lo script, perché ci sono due livelli di permessi: permessi sulla condivisione e permessi sul file system locale sono separati, e so solo come impostare i permessi sul file system locale quando è in esecuzione sul computer locale.
Joel Coel

0

Per Windows 7 prova questo:

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

Sopra funziona anche da PowerShell. Nota prima, FULL

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.