Создание общего ресурса с разрешениями с помощью Windows Powershell

9

Используя Powershell, как я могу создать общий ресурс и установить права доступа.

Например, следующим образом

  • Создайте общий ресурс с именем public, который отображается на «путь c: \ shares \ foo»
  • Разрешить DOMAIN1 \ Users доступ к общему ресурсу только для чтения (это не означает, что нужно задавать acls для файлов, а не для общего ресурса)
user2666
источник

Ответы:

7

Это должно сделать трюк:

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

Конечно, вам необходимо запустить PowerShell с правами администратора, в зависимости от того, где и как вы это делаете.

Мэтт Хэнсон
источник
7

Используйте метод 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 - МПК
    • 2147483648 - Дисковод Админ
    • 2147483649 - Администратор очереди печати
    • 2147483650 - Администратор устройства
    • 2147483651 - IPC Admin
  • MaximumAllowed - Максимальное количество пользователей, которым разрешено одновременно использовать этот ресурс. Пример: 100. Этот параметр является необязательным.
  • Описание - необязательный комментарий для описания ресурса, которым вы делитесь. Этот параметр не является обязательным. Пример: «Поделиться описанием».
  • Пароль - Пароль (когда сервер работает с безопасностью на уровне общего ресурса) для общего ресурса. Если сервер работает с безопасностью на уровне пользователя, этот параметр игнорируется. Этот параметр не является обязательным.
  • Access - дескриптор безопасности для разрешений на уровне пользователя. Дескриптор безопасности содержит информацию о разрешениях, владельце и возможностях доступа к ресурсу.

Смотрите эту страницу в MSDN для получения подробной информации о том, как установить права доступа: Win32_SecurityDescriptor Class . Эта статья также является хорошей отправной точкой: задачи WMI: файлы и папки .

splattne
источник
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}
     }
}
Джоэл Коэль
источник
Полное раскрытие: я адаптировал следующий код из поста, найденного в другом месте (к сожалению, мой компьютер вышел из строя, и я потерял ссылку, поэтому я не могу правильно приписать). Я помню, что этот вопрос о проблеме с сервером был выше в моем поиске, и поэтому я хотел включить свой результат здесь.
Джоэл Коэль
Спасибо за ваш сценарий, но я пытаюсь заставить его работать на удаленной папке, чтобы поделиться. Папка находится на NAS, без какого-либо пользовательского интерфейса для выполнения сценария powershell. У вас был ключ, чтобы заставить его работать на удаленной папке?
@ Badpandy, где мы используем это, я должен выполнить rdp на хост-машине, чтобы использовать сценарий, потому что есть два уровня разрешений: разрешения для общего ресурса и разрешения в локальной файловой системе являются отдельными, и я знаю только, как установить разрешения в локальной файловой системе при работе на локальной машине.
Джоэл Коэль
0

Для Windows 7 попробуйте это:

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

Выше также работает от PowerShell. Примечание `раньше, ПОЛНОЕ

Фрэнк Препсель
источник