Что нового

[Файловая система] Управление безопасностью общих папок (сетевых шар)

pvnn

Осваивающий
Сообщения
282
Репутация
31
С помощью AUTOIT можно легко создать, удалить, изменить Шару.
А как быть с безопасностью? Может уже есть готовая UDF?

Есть 2 главных вопроса по безопасности:

1. Права доступа на шару.
- Получить список пользователей на шару и уровень доступа к ней
- Добавить пользователей с определенным уровнем доступа
- Изменить уровень доступа у Пользователя на шару
- Удалить пользователей

2. Безопасность ntfs (вкладка безопасность)
- Получить список пользователей и уровень доступа
- Добавить пользователей с определенным уровнем доступа
- Изменить уровень доступа у Пользователя на ресурс
- Удалить пользователей



Код:
#Include <NetShare.au3>
#Include <Array.au3>

 $ShareName='new'
 $Kat="C:\test"

; Создать каталог
  DirCreate($Kat)

; Создать шару
  $Value=_Net_Share_ShareAdd (@ComputerName, $ShareName, 0, $Kat, "AutoIt Share Comment")

; Получить список пользователей и разрешений на шару?
; Добавить/Удалить/Изменить уровень пользователя?

; Получить список разрешений ntfs?
; Добавить/Удалить/Изменить уровень пользователя?
 
Автор
P

pvnn

Осваивающий
Сообщения
282
Репутация
31
Вот так можно создать Шару и настроить права на нее.
Права можно дать группе пользователей или конкретному пользователю (расскоментировать строку по тексту скрипта)


Код:
; ----------------------------------------------------------------------------
; Создание Шары и настройка разрешений
; ----------------------------------------------------------------------------

#Include <Array.au3>

; *****************************
; Настройка
; *****************************
$comp_name = "."              ;  имя компьютера  @ComputerName или его IP адресс (.(точка) - локальный хост)
$domain_name = "domen name"   ; Имя домена
$groups = "group name"        ; Группа


Const $Share_FullAccessMask        = 2032127 ; = "Full Control" + "Change" + "Read"
Const $Share_ModifyAccessMask      = 1245631 ; = "Change" + "Read"
Const $Share_ReadOnlyAccessMask    = 1180095 ; = "Read"

$Rights = $Share_FullAccessMask ; Объявляем права



; передаваемые параметры: 1 - локальный путь на сервере, 2 - название шары, 3 - список групп, 4 - пояснение к шаре
 sharesec ("c:\test", "Folder_TEST_NAME", $groups, $rights, "Для тестовых целей")

Exit


; * ПРОЦЕДУРА : создание шары
;
Func sharesec($Fname,$shr,$accounts, $permission, $info)
Local $Return
Dim $Services, $SecDescClass, $SecDesc
Dim $Trustee, $ACE
Dim $Share, $InParam, $Network
Dim $xDict, $i

 $wmiserv = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $comp_name & "\root\cimv2")
; $target_share = $wmiserv.Get("Win32_Share")
 $xDict = ObjCreate("Scripting.Dictionary")
 $Services = ObjGet("WINMGMTS:{impersonationLevel=impersonate,(Security)}!\\" & $comp_name & "\ROOT\CIMV2")
 $SecDescClass = $Services.Get("Win32_SecurityDescriptor")
 $SecDesc = $SecDescClass.SpawnInstance_()


;For $i = 0 to UBound ($accounts)
; Создаем access control entry (ACE)
 $Trustee = SetGroupTrustee($domain_name, $accounts) ; Узнаем SID группы или аккаунта
 $ACE = $Services.Get("Win32_Ace").SpawnInstance_    ; Создание пустой структуры ACE и Заполняю поля ACE
 $ACE.Properties_.Item("AccessMask") = $permission   ; Права
 $ACE.Properties_.Item("AceFlags") = 3
 $ACE.Properties_.Item("AceType") = 0
 $ACE.Properties_.Item("Trustee") = $Trustee

 $xDict.Add ($accounts, $ACE)                        ; Ключу $accounts привязываем значение $ACE
 $SecDesc.Properties_.Item("DACL") = $xDict.Items    ; Добавляем в DACL строку $ACE


; Создаем непосредственно Шару
 $Share = $Services.Get("Win32_Share")
 $InParam = $Share.Methods_("Create").InParameters.SpawnInstance_()
 $InParam.Properties_.Item("Access") = $SecDesc
 $InParam.Properties_.Item("Description") = $info
 $InParam.Properties_.Item("Name") = $shr
 $InParam.Properties_.Item("Path") = $Fname
; $InParam.Properties_.Item("MaximumAllowed") = 5
 $InParam.Properties_.Item("Type") = 0
 $Share.ExecMethod_ ("Create", $InParam)
	Return $Return
EndFunc



; *****************************
; * Функция : узнаем SID группы
; *****************************
Func SetGroupTrustee($strDomain, $strName)
	Local $Return
Dim $objTrustee, $Spawn, $account, $accountSID
 $objTrustee = ObjGet("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee")
 $Spawn=$objTrustee.Spawninstance_
 $account =    ObjGet("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='" & $strName & "',Domain='" & $strDomain &"'")      ; Для определения Групп пользователей
 ;$account =    ObjGet("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_UserAccount.Name='" & $strName & "',Domain='" & $strDomain &"'") ; Для определения Пользователей
 $accountSID = ObjGet("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_SID.SID='" & $account.SID &"'")
 $Spawn.Domain = $strDomain
 $Spawn.Name = $strName
 $Spawn.Properties_.item("SID") = $accountSID.BinaryRepresentation
 $Return = $Spawn
	Return $Return
EndFunc



Теперь нужно полчить список (лист) Шар
Может кто знает?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Попробуй так (переводил с VBS, проверить не на чем)
Код:
$strComputer = "."
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" &  $strComputer & "\root\cimv2")
$colShares = $objWMIService.ExecQuery("Select * from Win32_Share")
For $objShare in $colShares
    ConsoleWrite("AllowMaximum: " & @Tab &  $objShare.AllowMaximum)
    ConsoleWrite("Caption: " & @Tab &  $objShare.Caption)
    ConsoleWrite("MaximumAllowed: " & @Tab &  $objShare.MaximumAllowed)
    ConsoleWrite("Name: " & @Tab &  $objShare.Name)
    ConsoleWrite("Path: " & @Tab &  $objShare.Path)
    ConsoleWrite("Type: " & @Tab &  $objShare.Type)
Next
 
Автор
P

pvnn

Осваивающий
Сообщения
282
Репутация
31
Kaster сказал(а):
Попробуй так (переводил с VBS, проверить не на чем)
...эээ... я неправильно выразился получить список не шар... а пользователей и групп и их права на ресурс :-[
Твоим способом я получу список всех шар на компе.
В примере выше я Расшариваю каталог c:\test и Назначаю права какой-либо указанной группе в домене на данный ресурс... Вот
А теперь я бы хотел узнать список всех Групп и пользователей а также их права на данный ресурс
 
Автор
P

pvnn

Осваивающий
Сообщения
282
Репутация
31
Нашел как увидеть разрешения ntfs

Код:
; Список разрешений ntfs

#Include <Array.au3>

Dim $sDrive, $wmiFileSecSetting,$objWMIService,$colFolders
[email protected]
$folderpath='c:\test'
$folderpath = StringReplace($folderpath, "\", "\\")
Dim $RetVal,$DACL,$wmiSecurityDescriptor,$wmiAce


; Объявляем двумерный массив и заполняем первую строку
  Local $aAccessNTFS[1][4]
  $aAccessNTFS[0][0]="Account"      ; Домен/Пользователь
  $aAccessNTFS[0][1]="AccessMask"   ; Разрешения NTFS
  $aAccessNTFS[0][2]="AceFlags"     ; AceFlags = 3 - Стандартные разрешения (полный доступ, изменение, чтение итд), AceFlags = 0  Custom, выборочные разрешения
  $aAccessNTFS[0][3]="AceType"      ; Тип Доступа. AceType = 0 - Доступ Разрешен, AceType = 1 - Доступ Запрещен




; Get the security set for the object
  $wmiFileSecSetting = ObjGet("winmgmts:Win32_LogicalFileSecuritySetting.path='" & $folderpath & "'")
; verify that the get was successful
  $RetVal = $wmiFileSecSetting.GetSecurityDescriptor($wmiSecurityDescriptor)
  ; If $Err Then
  ;     MsgBox ("GetSecurityDescriptor failed" & @CRLF & @error & @CRLF & $Err.Description)
  ;VA      $Err.Clear
  ; EndIf

; Далее
 $objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
 $colFolders = $objWMIService.ExecQuery("SELECT * FROM Win32_Directory WHERE Name ='" & $folderpath & "'")

 For $objFolder In $colFolders
    ; Retrieve the $DACL array of Win32_ACE objects.
      $DACL = $wmiSecurityDescriptor.DACL
    ;_ArrayDisplay($DACL)
   For $wmiAce In $DACL
       ; Get Win32_Trustee object from ACE
         $Trustee = $wmiAce.Trustee
 ;MsgBox(0,'','Домен/Пользователь: '&$Trustee.Domain&'/'&$Trustee.Name&@CRLF&'Разрешения NTFS: '&$wmiAce.AccessMask&@CRLF&'Флаг: '&$wmiAce.AceFlags&@CRLF&'Тип Доступа: '&$wmiAce.AceType)
			   $RowsArray=UBound($aAccessNTFS)                   ; Определяем размерность массива
	           ReDim $aAccessNTFS[$RowsArray+1][4]               ; Изменить размер массива
	                 $aAccessNTFS[$RowsArray][0]=$Trustee.Domain&'/'&$Trustee.Name  ; Домен/Пользователь
	                 $aAccessNTFS[$RowsArray][1]=$wmiAce.AccessMask  ; Разрешения NTFS
					 $aAccessNTFS[$RowsArray][2]=$wmiAce.AceFlags    ; AceFlags = 3 - Стандартные разрешения (полный доступ, изменение, чтение итд), AceFlags = 0 - Custom, выборочные разрешения
					 $aAccessNTFS[$RowsArray][3]=$wmiAce.AceType     ; Тип Доступа. AceType = 0 - Доступ Разрешен, AceType = 1 - Доступ Запрещен

   Next

 Next

_ArrayDisplay($aAccessNTFS)
Exit







Добавлено:
Сообщение автоматически объединено:

Нашел как добавить нового пользователя со своими правами
Только вот проблема, После добавления пользователя, слетает у всех других пользователей наследование. Вопрос, как можно добавить пользователя с наследованием

Код:
; ----------------------------------------------------------------------------
; Настройка разрешений ntfs
; ----------------------------------------------------------------------------

#Include <Array.au3>

; *****************************
; Настройка
; *****************************
$comp_name = "."
$domain_name = "домен"                 ; Имя домена или @ComputerName
$Groups=1                            ; $Groups=1 - Группа,  $Groups=0 - Пользователь
$AccountName = "programmers"    ; Имя
$folderpath='c:\test'                ; Каталог

$folderpath = StringReplace($folderpath, "\", "\\")


; Тип доступа
Const $ACCESS_ALLOWED = 0  ; Доступ разрешен
Const $ACCESS_DENIED = 1   ; Доступ запрещен

Const $SE_DACL_PROTECTED = 4096

; Детальные разрешения NTFS
Const $VIEW_FOLDERS_EXECUTE_FILES 	= 32		; Обзор папок/Выполнение файлов
Const $LIST_FOLDER_READ_DATA 		= 1			; Содержание папки/Чтение данных
Const $READ_ATTRIBUTES 				= 128		; Чтение атрибутов
Const $READ_ADDITIONAL_ATTRIBUTES 	= 8			; Чтение дополнительных атрибутов
Const $CREATE_FILES_WRITE_DATA 		= 2			; Создание файлов/Запись данных
Const $CREATE_FOLDERS_APPEND_DATA 	= 4			; Создание папок/Дозапись данных
Const $WRITE_ATTRIBUTES 			= 256		; Запись атрибутов
Const $WRITE_ADDITIONAL_ATTRIBUTES 	= 16		; Запись дополнительных атрибутов
Const $DEL_SUBFOLDERS_FILES 		= 64		; Удаление подпапок и файлов
Const $DEL 							= 65536		; Удаление
Const $READ_DAC 					= 131072    ; Чтение разрешений
Const $WRITE_DAC 					= 262144    ; Смена разрешений
Const $WRITE_OWNER 					= 524288	; Смена владельца
Const $FLAG_SYNCHRONIZE 			= 1048576	; Синхронизация

; Сводка разрешений NTFS
Const $FullAccessMask           = 2032127  ; Полный доступ
Const $ModifyAccessMask         = 1245631  ; Изменение
Const $ReadAndExecuteAccessMask = 1179817  ; Чтение и Выполнение
Const $ListFolderAccessMask = $ReadAndExecuteAccessMask ; 1179817 Список содержимого папки
Const $ReadAccessMask           = 1179785  ; Чтение
Const $WriteAccessMask          = 1048854  ; Запись
; Составные разрешения NTFS
Const $ReadAndWriteAccessMask           = 1180063 ; Чтение + Запись
Const $ReadAndExecuteAndWriteAccessMask = 1180095 ; Чтение и Выполнение + Запись

Dim $objSecSettings,$objSD,$arrACE

; Присваиваем Разрешения ntfs
$rights=$ModifyAccessMask

;MsgBox(0,'',$WriteAccessMask)
;Exit


; ВЫполнить функцию
 sharesec ($folderpath, $AccountName, $rights)

Exit



;
Func sharesec($Fname,$accounts, $permission)
 Local $Return
 Dim $Services, $SecDescClass, $SecDesc
 Dim $Trustee, $ACE
 Dim $Share, $InParam, $Network
 Dim $xDict, $i

 $wmiserv = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $comp_name & "\root\cimv2")
 $xDict = ObjCreate("Scripting.Dictionary")
 $Services = ObjGet("WINMGMTS:{impersonationLevel=impersonate,(Security)}!\\" & $comp_name & "\ROOT\CIMV2")
 $SecDescClass = $Services.Get("Win32_SecurityDescriptor")
 $SecDesc = $SecDescClass.SpawnInstance_()


;For $i = 0 to UBound ($accounts)
; Создаем access control entry (ACE)
 $Trustee = SetGroupTrustee($domain_name, $accounts) ; Узнаем SID группы или аккаунта
 $ACE = $Services.Get("Win32_Ace").SpawnInstance_    ; Создание пустой структуры ACE и Заполняю поля ACE
 $ACE.Properties_.Item("AccessMask") =  $rights      ; Разрешения NTFS
 $ACE.Properties_.Item("AceFlags") = 3               ; ACE флаг 3-без наследования 0 - custom
 $ACE.Properties_.Item("AceType") = $ACCESS_ALLOWED  ; Тип Доступа
 $ACE.Properties_.Item("Trustee") = $Trustee         ; SID группы или аккаунта
 


; Добавляем строку в массив
 $objSecSettings = ObjGet("winmgmts:Win32_LogicalFileSecuritySetting.path='" & $Fname & "'") ; Get the security set for the object
  $objSecSettings.GetSecurityDescriptor($objSD) ; Получаем SecurityDescriptor
  $arrACE = $objSD.DACL   ;'чтение массива записей ACL
  _ArrayAdd($arrACE,$ACE)
 ; _ArrayDisplay($arrACE)
  $objSD.DACL = $arrACE
  $objSecSettings.SetSecurityDescriptor($objSD)
EndFunc



; *****************************
; * Функция : узнаем SID группы
; *****************************
Func SetGroupTrustee($strDomain, $strName)
	Local $Return
Dim $objTrustee, $Spawn, $account, $accountSID
 $objTrustee = ObjGet("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee")
 $Spawn=$objTrustee.Spawninstance_
 If $Groups=1 Then
    $account =    ObjGet("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='" & $strName & "',Domain='" & $strDomain &"'")      ; Для определения Групп пользователей
 Else
    $account =    ObjGet("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_UserAccount.Name='" & $strName & "',Domain='" & $strDomain &"'") ; Для определения Пользователей
 EndIf
 $accountSID = ObjGet("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_SID.SID='" & $account.SID &"'")
 $Spawn.Domain = $strDomain
 $Spawn.Name = $strName
 $Spawn.Properties_.item("SID") = $accountSID.BinaryRepresentation
 $Return = $Spawn
	Return $Return
EndFunc
 

degid

Новичок
Сообщения
15
Репутация
1
[Файловая система] Re: [Файловая система] Управление безопасностью общих папок (сетевых шар)

Тут pvnn показал как расшарить папку и добавить пользователя или группу с определенным уровнем доступа... как добавить несколько пользователей и групп?
При повторном использовании метода "Create" правила доступа не меняются, а если юзать "SetShareInfo", то ругается
The requested action with this object has failed.

это

Код:
$InParam = $Share.Methods_("Create").InParameters.SpawnInstance_()
$InParam.Properties_.Item("Access") = $SecDesc
$InParam.Properties_.Item("Description") = $info
$InParam.Properties_.Item("Name") = $shr
$InParam.Properties_.Item("Path") = $Fname
$InParam.Properties_.Item("Type") = 0
$Share.ExecMethod_ ("Create", $InParam)

заменил на это

Код:
$InParam = $Share.Methods_("SetShareInfo").InParameters.SpawnInstance_()
$InParam.Properties_.Item("Description") = $info
$InParam.Properties_.Item("Access") = $SecDesc
$Share.ExecMethod_ ("SetShareInfo", $InParam) ; тут ругается "The requested action with this object has
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
degid
используй функцию создания чего-бы то ни было в цикле.
 

degid

Новичок
Сообщения
15
Репутация
1
Kaster сказал(а):
degid
используй функцию создания чего-бы то ни было в цикле.
это в каком месте? :blink:


Добавлено:
Сообщение автоматически объединено:

Kaster
Спасибо, понял как можно добавлять сколько угодно групп и пользователей при создании :smile:

Код:
; Создаем access control entry (ACE)
 $Trustee = SetGroupTrustee($domain_name, $accounts) ; Узнаем SID группы или аккаунта
 $ACE = $Services.Get("Win32_Ace").SpawnInstance_    ; Создание пустой структуры ACE и Заполняю поля ACE
 $ACE.Properties_.Item("AccessMask") = $permission   ; Права
 $ACE.Properties_.Item("AceFlags") = 3
 $ACE.Properties_.Item("AceType") = 0
 $ACE.Properties_.Item("Trustee") = $Trustee

 $xDict.Add ($accounts, $ACE)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
degid
вот тут
Код:
For $account in $accounts
		; Создаем access control entry (ACE)
		$Trustee = SetGroupTrustee($domain_name, $account) ; Узнаем SID группы или аккаунта
		$ACE = $Services.Get("Win32_Ace").SpawnInstance_    ; Создание пустой структуры ACE и Заполняю поля ACE
		$ACE.Properties_.Item("AccessMask") =  $rights      ; Разрешения NTFS
		$ACE.Properties_.Item("AceFlags") = 3               ; ACE флаг 3-без наследования 0 - custom
		$ACE.Properties_.Item("AceType") = $ACCESS_ALLOWED  ; Тип Доступа
		$ACE.Properties_.Item("Trustee") = $Trustee         ; SID группы или аккаунта



		; Добавляем строку в массив
		$objSecSettings = ObjGet("winmgmts:Win32_LogicalFileSecuritySetting.path='" & $Fname & "'") ; Get the security set for the object
		$objSecSettings.GetSecurityDescriptor($objSD) ; Получаем SecurityDescriptor
		$arrACE = $objSD.DACL   ;'чтение массива записей ACL
		_ArrayAdd($arrACE,$ACE)
		; _ArrayDisplay($arrACE)
		$objSD.DACL = $arrACE
		$objSecSettings.SetSecurityDescriptor($objSD)
	Next

только надо чтобы аккаунты были в массиве, даже если всего 1
 

degid

Новичок
Сообщения
15
Репутация
1
Kaster сказал(а):
только надо чтобы аккаунты были в массиве, даже если всего 1
да, понял... начал было делать проверку массив это или нет, а потом просто коммент к функции дописал чтоб не забыть и всё :smile:
правда я ещё это всё немного по другому оформил...
Код:
For $i = 0 to UBound($accounts)-1
; Создаем access control entry (ACE)
		$Trustee = SetGroupTrustee(@ComputerName, $accounts[$i][0], $accounts[$i][1]) ; Узнаем SID группы или аккаунта
		$ACE = $Services.Get("Win32_Ace").SpawnInstance_    ; Создание пустой структуры ACE и Заполняю поля ACE
		$ACE.Properties_.Item("AccessMask") = $accounts[$i][2]   ; Права
		$ACE.Properties_.Item("AceFlags") = 3
		$ACE.Properties_.Item("AceType") = 0
		$ACE.Properties_.Item("Trustee") = $Trustee
		$xDict.Add($accounts[$i][0], $ACE)            ; Ключу $accounts привязываем значение $ACE
	Next
 $SecDesc.Properties_.Item("DACL") = $xDict.Items    ; Добавляем в DACL строку $ACE
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
degid
да. можно по всякому и наверняка оптимизировать, но я так, чисто в лоб. ты спросил я ответил :smile:
 
Верх