使用Windows Powershell创建具有权限的共享


9

使用Powershell如何创建共享并设置访问权限。

例如如下

  • 创建名为“ public”的共享,该共享映射到“ path c:\ shares \ foo”
  • 允许DOMAIN1 \ Users对共享具有只读访问权限(这并不意味着在文件上而是在共享上设置ACL)

Answers:


7

这应该可以解决问题:

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

当然,您需要使用管理权限来启动PowerShell,具体取决于您执行此操作的位置/方式。


7

使用Win32_Share创建方法。例:

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

您可以在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
);

参数:

  • 路径-Windows共享的本地路径。例如,“ C:\ FolderToShare”。
  • 名称-将别名传递到在Windows系统上设置为共享的路径。例如,“ ShareName”。
  • 类型-传递要共享的资源的类型。类型包括磁盘驱动器,打印队列,进程间通信(IPC)和常规设备。可以是以下值之一。
    • 0-磁盘驱动器
    • 1-打印队列
    • 2-装置
    • 3-IPC
    • 2147483648-磁盘驱动器管理员
    • 2147483649-打印队列管理员
    • 2147483650-设备管理员
    • 2147483651-IPC管理员
  • MaximumAllowed-允许同时使用此资源的最大用户数的限制。示例:100。此参数是可选的。
  • 描述-可选注释,用于描述正在共享的资源。此参数是可选的。示例:“共享描述”。
  • 密码-共享资源的密码(当服务器以共享级安全性运行时)。如果服务器以用户级安全性运行,则忽略此参数。此参数是可选的。
  • 访问-用户级别权限的安全描述符。安全描述符包含有关资源的权限,所有者和访问功能的信息。

有关如何设置访问权限的详细信息,请参见MSDN上的此页面:Win32_SecurityDescriptor Class。本文也是一个很好的起点:WMI任务:文件和文件夹


2

下面的功能是一个示例,可以根据需要进行调整。主要限制是它必须在要托管共享的计算机上运行(或可能首先使用PS Remoting到达该计算机)。运行脚本的帐户还必须具有足够的权限才能创建共享。

如所写,它期望一个DirectoryInfo对象作为它的参数,但是将其适应字符串并不难。该示例包括对两个不同对象(一个用户和一个组)的文件夹权限,每个对象具有不同的访问权限,因此您可以了解如何混合和匹配复杂的权限要求:

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

完全公开:我改编自其他地方的帖子中的以下代码(可悲的是,我的PC崩溃了,我丢失了链接,因此我无法正确地归属)。我确实记得这个serverfault问题在我的搜索中排名较高,所以我想在这里包括我的结果。
Joel Coel 2012年

感谢您的脚本,但我正在尝试使其在远程文件夹上工作以进行共享。该文件夹位于NAS上,没有任何UI可以执行任何powershell脚本。您是否有使其在远距离文件夹上工作的提示?

@Badpandy在这里使用它,我必须rdp到主机才能使用脚本,因为有两个权限级别:共享权限和本地文件系统权限是分开的,而且我只知道如何设置权限在本地计算机上运行时在本地文件系统上运行。
乔尔·科尔

0

对于Windows 7,请尝试以下操作:

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

上面的内容也可以在PowerShell中使用。注意`之前,已满

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.