Membuat Berbagi dengan Izin dengan Windows Powershell

9

Menggunakan Powershell bagaimana saya bisa membuat bagikan dan mengatur izin akses.

Misalnya sebagai berikut

  • Buat share yang disebut "publik" yang memetakan ke "path c: \ share \ foo"
  • Izinkan DOMAIN1 \ Pengguna memiliki akses hanya baca ke share (ini tidak berarti mengatur ACL pada file, bukan pada share)
pengguna2666
sumber

Jawaban:

7

Ini harus melakukan trik:

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

Tentu saja, Anda harus meluncurkan PowerShell dengan hak administratif, tergantung di mana / bagaimana Anda melakukan ini.

Matt Hanson
sumber
7

Gunakan metode Buat Win32_Share. Contoh:

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

Anda dapat menemukan dokumentasi metode ini di 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
);

Parameter:

  • Path - Path lokal dari share Windows. Misalnya, "C: \ FolderToShare".
  • Name - Melewati alias ke lintasan yang ditetapkan sebagai bagian pada sistem Windows. Contoh, "ShareName".
  • Type - Melewati jenis sumber daya yang dibagikan. Jenis termasuk drive disk, antrian cetak, komunikasi antarproses (IPC), dan perangkat umum. Dapat berupa salah satu dari nilai berikut.
    • 0 - Disk Drive
    • 1 - Antrian Cetak
    • 2 - Perangkat
    • 3 - IPC
    • 2147483648 - Admin Drive Disk
    • 2147483649 - Cetak Antrian Admin
    • 2147483650 - Admin Perangkat
    • 2147483651 - Admin IPC
  • Maksimum yang Diberikan - Batas jumlah maksimum pengguna yang diizinkan untuk menggunakan sumber ini secara bersamaan. Contoh: 100. Parameter ini opsional.
  • Deskripsi - Komentar opsional untuk menggambarkan sumber yang dibagikan. Parameter ini opsional. Contoh: "Bagikan deskripsi".
  • Kata Sandi - Kata Sandi (ketika server berjalan dengan keamanan tingkat berbagi) untuk sumber daya bersama. Jika server berjalan dengan keamanan tingkat pengguna, parameter ini diabaikan. Parameter ini opsional.
  • Access - deskriptor keamanan untuk izin tingkat pengguna. Deskriptor keamanan berisi informasi tentang izin, pemilik, dan kemampuan akses sumber daya.

Lihat halaman ini di MSDN untuk detail bagaimana mengatur izin akses: Kelas Win32_SecurityDescriptor . Artikel ini juga merupakan titik awal yang baik: Tugas WMI: File dan Folder .

percikan
sumber
2

Fungsi di bawah ini adalah contoh, dan dapat disesuaikan dengan apa pun yang Anda butuhkan. Pembatasan utamanya adalah harus dijalankan di mesin tempat berbagi akan di-host (atau mungkin menggunakan PS Remoting untuk mencapai mesin itu terlebih dahulu). Akun yang menjalankan skrip juga harus memiliki izin yang memadai untuk membuat saham.

Seperti yang tertulis, ia mengharapkan DirectoryInfoobjek sebagai argumennya, tetapi tidak akan sulit untuk menyesuaikannya dengan string. Contohnya termasuk izin pada folder untuk dua objek yang berbeda (satu pengguna dan satu grup), masing-masing dengan berbagai jenis akses, sehingga Anda dapat melihat cara mencampur dan mencocokkan untuk persyaratan izin yang kompleks:

# $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
sumber
Pengungkapan penuh: Saya mengadaptasi kode berikut dari pos yang ditemukan di tempat lain (sayangnya, PC saya mogok dan saya kehilangan tautan, jadi saya tidak dapat mengaitkan dengan benar). Saya ingat pertanyaan serverfault ini berperingkat lebih tinggi dalam pencarian saya, jadi saya ingin memasukkan hasil saya di sini.
Joel Coel
Terima kasih atas skrip Anda, tetapi saya mencoba membuatnya berfungsi pada folder yang jauh untuk dibagikan. Folder berada di NAS, tanpa UI apa pun untuk menjalankan skrip PowerShell. Apakah Anda memiliki petunjuk untuk membuatnya berfungsi pada folder yang jauh?
@Badpandy tempat kita menggunakan ini, saya harus rdp ke mesin host untuk menggunakan skrip, karena ada dua tingkat izin: izin pada bagian dan izin pada sistem file lokal terpisah, dan saya hanya tahu cara mengatur izin pada sistem file lokal saat dijalankan pada mesin lokal.
Joel Coel
0

Untuk Windows 7 coba ini:

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

Di atas juga berfungsi dari PowerShell. Catat `sebelumnya, FULL

Frank Prepsel
sumber