Используя Powershell, как я могу создать общий ресурс и установить права доступа.
Например следующим образом
Используйте метод 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
);
Параметры:
См. Эту страницу в MSDN для получения подробной информации о том, как установить права доступа: Класс Win32_SecurityDescriptor. Эта статья также является хорошей отправной точкой: Задачи WMI: файлы и папки.
Это должно помочь:
net share "Public=c:\shares\foo" "/GRANT:Users,READ"
Конечно, вам нужно будет запустить PowerShell с правами администратора, в зависимости от того, где и как вы это делаете.
Приведенная ниже функция является примером и может быть адаптирована к любым вашим потребностям. Основное ограничение заключается в том, что он должен быть запущен на машине, на которой должен быть размещен общий ресурс (или, возможно, с использованием 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}
}
}
Для Windows 7 попробуйте следующее:
net SHARE share=d:\share /GRANT:EVERYONE`,FULL /REMARK:"
Выше также работает из PowerShell. Обратите внимание на `before, FULL