Tạo Chia sẻ với Quyền với Windows Powershell


9

Sử dụng Powershell làm cách nào tôi có thể tạo chia sẻ và đặt quyền truy cập.

Ví dụ như sau

  • Tạo chia sẻ được gọi là "công khai" ánh xạ tới "đường dẫn c: \ Shares \ foo"
  • Cho phép DOMAIN1 \ Người dùng có quyền truy cập chỉ đọc vào chia sẻ (điều này không có nghĩa là đặt acls trên các tệp, thay vào đó là chia sẻ)

Câu trả lời:


7

Cái này cần phải dùng mẹo:

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

Tất nhiên, bạn sẽ cần khởi chạy PowerShell với quyền quản trị, tùy thuộc vào vị trí / cách bạn thực hiện việc này.


7

Sử dụng phương pháp Tạo Win32_Share. Thí dụ:

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

Bạn có thể tìm thấy tài liệu của phương pháp này ở đây trên 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
);

Thông số:

  • Đường dẫn - Đường dẫn cục bộ của Windows chia sẻ. Ví dụ: "C: \ FolderToShare".
  • Tên - Truyền bí danh cho một đường dẫn được thiết lập dưới dạng chia sẻ trên hệ thống Windows. Ví dụ: "Chia sẻ tên".
  • Loại - Truyền loại tài nguyên đang được chia sẻ. Các loại bao gồm ổ đĩa, hàng đợi in, truyền thông liên tiến trình (IPC) và các thiết bị chung. Có thể là một trong những giá trị sau.
    • 0 - Ổ đĩa
    • 1 - Hàng đợi in
    • 2 - Thiết bị
    • 3 - IPC
    • 2147483648 - Quản trị ổ đĩa
    • 2147483649 - Quản trị in hàng đợi
    • 2147483650 - Quản trị viên thiết bị
    • 2147483651 - Quản trị viên IPC
  • Maximum ALLowed - Giới hạn số lượng người dùng tối đa được phép sử dụng đồng thời tài nguyên này. Ví dụ: 100. Tham số này là tùy chọn.
  • Mô tả - Nhận xét tùy chọn để mô tả tài nguyên đang được chia sẻ. Tham số này là tùy chọn. Ví dụ: "Chia sẻ mô tả".
  • Mật khẩu - Mật khẩu (khi máy chủ đang chạy với bảo mật cấp chia sẻ) cho tài nguyên được chia sẻ. Nếu máy chủ đang chạy với bảo mật cấp người dùng, tham số này sẽ bị bỏ qua. Tham số này là tùy chọn.
  • Truy cập - Mô tả bảo mật cho quyền người dùng cấp. Một mô tả bảo mật chứa thông tin về các quyền, chủ sở hữu và khả năng truy cập của tài nguyên.

Xem trang này trên MSDN để biết chi tiết cách đặt quyền truy cập: Lớp Win32_SecurityDescriptor . Bài viết này cũng là một điểm khởi đầu tốt: Nhiệm vụ WMI: Tệp và thư mục .


2

Hàm dưới đây là một ví dụ và có thể được điều chỉnh phù hợp với bất cứ thứ gì bạn cần. Hạn chế chính là nó phải được chạy trên máy nơi chia sẻ sẽ được lưu trữ (hoặc có thể sử dụng PS Remote để tiếp cận máy đó trước). Tài khoản chạy tập lệnh cũng phải có đủ quyền để tạo cổ phần.

Như đã viết, nó mong đợi một DirectoryInfođối tượng là đối số của nó, nhưng sẽ không khó để điều chỉnh nó cho chuỗi. Ví dụ bao gồm các quyền trên thư mục cho hai đối tượng khác nhau (một người dùng và một nhóm), mỗi đối tượng có các loại quyền truy cập khác nhau, để bạn có thể xem cách trộn và khớp với các yêu cầu cấp phép phức tạp:

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

Tiết lộ đầy đủ: Tôi đã điều chỉnh mã sau đây từ một bài đăng được tìm thấy ở nơi khác (đáng buồn là PC của tôi bị hỏng và tôi bị mất liên kết, vì vậy tôi không thể thuộc tính chính xác). Tôi nhớ rằng câu hỏi về lỗi máy chủ này được xếp hạng cao hơn trong tìm kiếm của tôi và vì vậy tôi muốn đưa kết quả của mình vào đây.
Joel Coel

Cảm ơn kịch bản của bạn, nhưng tôi đang cố gắng làm cho nó hoạt động trên một thư mục xa để chia sẻ. Thư mục nằm trên một NAS, không có bất kỳ UI nào để thực thi bất kỳ tập lệnh powershell nào. Bạn đã có manh mối để làm cho nó hoạt động trên một thư mục xa?

@Badpandy nơi chúng tôi sử dụng cái này, tôi phải truy cập vào máy chủ để sử dụng tập lệnh, bởi vì có hai cấp độ quyền: quyền trên chia sẻ và quyền trên hệ thống tệp cục bộ riêng biệt và tôi chỉ biết cách đặt quyền trên hệ thống tập tin cục bộ khi chạy trên máy cục bộ.
Joel Coel

0

Đối với Windows 7, hãy thử điều này:

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

Ở trên cũng hoạt động từ PowerShell. Lưu ý `trước, ĐẦY ĐỦ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.