user2666 Asked: 2009-05-17 15:54:26 +0800 CST2009-05-17 15:54:26 +0800 CST 2009-05-17 15:54:26 +0800 CST 使用 Windows Powershell 创建具有权限的共享 772 使用 Powershell 如何创建共享并设置访问权限。 例如如下 创建名为“public”的共享,映射到“路径 c:\shares\foo” 允许 DOMAIN1\Users 对共享具有只读访问权限(这并不意味着在文件上设置 acls,而是在共享上设置) windows network-share powershell 4 个回答 Voted Matt Hanson 2009-05-17T23:06:58+08:002009-05-17T23:06:58+08:00 这应该可以解决问题: net share "Public=c:\shares\foo" "/GRANT:Users,READ" 当然,您需要使用管理权限启动 PowerShell,具体取决于您在哪里/如何执行此操作。 splattne 2009-05-18T01:45:22+08:002009-05-18T01:45:22+08:00 使用 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 系统上设置为共享的路径。例如,“共享名”。 类型 - 传递共享资源的类型。类型包括磁盘驱动器、打印队列、进程间通信 (IPC) 和通用设备。可以是以下值之一。 0 - 磁盘驱动器 1 - 打印队列 2 - 设备 3 - 工业电脑 2147483648 - 磁盘驱动器管理员 2147483649 - 打印队列管理员 2147483650 - 设备管理员 2147483651 - IPC 管理员 MaximumAllowed - 限制允许同时使用此资源的最大用户数。示例:100。此参数是可选的。 描述 - 描述共享资源的可选注释。此参数是可选的。示例:“共享说明”。 密码 - 共享资源的密码(当服务器以共享级别安全运行时)。如果服务器以用户级安全性运行,则忽略此参数。此参数是可选的。 访问 - 用户级别权限的安全描述符。安全描述符包含有关资源的权限、所有者和访问能力的信息。 有关如何设置访问权限的详细信息,请参阅 MSDN 上的此页面:Win32_SecurityDescriptor Class。本文也是一个很好的起点:WMI 任务:文件和文件夹。 Joel Coel 2012-06-20T10:54:33+08:002012-06-20T10:54:33+08:00 下面的函数是一个示例,可以根据您的需要进行调整。主要限制是它必须在要托管共享的机器上运行(或者可能使用 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} } } Frank Prepsel 2019-10-02T06:08:06+08:002019-10-02T06:08:06+08:00 对于 Windows 7,试试这个: net SHARE share=d:\share /GRANT:EVERYONE`,FULL /REMARK:" 以上也适用于 PowerShell。注意`之前,FULL
这应该可以解决问题:
当然,您需要使用管理权限启动 PowerShell,具体取决于您在哪里/如何执行此操作。
使用 Win32_Share 创建方法。例子:
您可以在 MSDN 上找到此方法的文档。
参数:
有关如何设置访问权限的详细信息,请参阅 MSDN 上的此页面:Win32_SecurityDescriptor Class。本文也是一个很好的起点:WMI 任务:文件和文件夹。
下面的函数是一个示例,可以根据您的需要进行调整。主要限制是它必须在要托管共享的机器上运行(或者可能使用 PS Remoting 首先到达该机器)。运行脚本的帐户还必须具有足够的权限才能创建共享。
正如所写的那样,它期望一个
DirectoryInfo
对象作为它的参数,但是将它用于字符串并不难。该示例包括两个不同对象(一个用户和一个组)的文件夹权限,每个对象具有不同类型的访问权限,因此您可以了解如何混合和匹配复杂的权限要求:对于 Windows 7,试试这个:
以上也适用于 PowerShell。注意`之前,FULL