使用 Powershell 如何使用共享并设置访问权限。
例如如下
- 创建名为“public”的共享,映射到“路径 c:\shares\foo”
- 允许 DOMAIN1\Users 对共享具有只读访问权限(这并不意味着在文件上设置 acl,而是在共享上设置 acl)
答案1
这应该可以解决问题:
net share "Public=c:\shares\foo" "/GRANT:Users,READ"
当然,您需要以管理员权限启动 PowerShell,具体取决于您在何处/如何执行此操作。
答案2
使用 Win32_Share Create 方法。例如:
(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 类这篇文章也是一个很好的起点:WMI 任务:文件和文件夹。
答案3
以下函数是一个示例,可以根据您的需要进行调整。主要限制是它必须在要托管共享的计算机上运行(或者可能首先使用 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}
}
}
答案4
对于 Windows 7,请尝试以下操作:
net SHARE share=d:\share /GRANT:EVERYONE`,FULL /REMARK:"
以上内容也可在 PowerShell 中使用。注意` 之前,FULL