Что нового

[Автоматизация] Автоматическое добавление пользователя в группу

vuttol

Новичок
Сообщения
2
Репутация
0
Задача: добавить пользователя в определенную локальную группу.

Есть найденный рабочий кусок кода
Код:
$dso = ObjGet("WinNT:")
   $objGroup = ObjGet("WinNT://" & @ComputerName & "/" & $groupName & ",group")
   $objUser = $dso.OpenDSObject("WinNT://" & $Domen & "/" & $userName, $Domen & "\" & $adminName, $adminPas, 1)
   $objGroup.Add($objUser.ADsPath)


Код прекрасно работает, если пользователь в указанной группе нет, но если он есть, то появляется ошибка.

Вопрос: Как проверить не состоит ли уже пользователь в нужной группе
 

pvnn

Осваивающий
Сообщения
305
Репутация
32
Можно так:
https://www.autoitscript.com/forum/topic/74118-local-account-udf/

Код:
#RequireAdmin

#include <LocalAccount.au3>
#include <Array.au3>


$Enum=_GroupEnum(@ComputerName) ; Вывести список всех локальных групп
_ArrayDisplay($Enum)

$Enum=_GroupExists('Администраторы',@ComputerName) ; Проверка существования группы
MsgBox(0,'',$Enum)

; Добавить локального пользователя 'user' в локальную группу 'Администраторы'
$Enum=_AccountAddToGroup('user','Администраторы')
MsgBox(0,'',$Enum)

Похоже UDF была для XP, на Win7 у меня не все функции работают
Работают медленно (по 10 минут каждая):
_AccountEnumGroups
_GroupEnumMembers
_AccountIsMember
Но в самой Udf можно посмотреть реализацию, может это поможет




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

Через WinNT можно сделать так.
Скорость работы в среднем секунд 5

Код:
;#RequireAdmin
#include <Array.au3>
$objIADsError = ObjEvent("AutoIt.Error", "objIADsErrFunc")

Global $IADsError = 0

Func objIADsErrFunc()
	$IADsError = -1
EndFunc


; Получить список всех пользователей группы
$Enum=_AccountEnumGroups('Администраторы')
_ArrayDisplay($Enum)

; Проверить, является ли пользователь членом группы
$Enum=_AccountIsMember('user','Администраторы')
MsgBox(0,'',$Enum)
Exit


; Получить список всех пользователей группы
Func _AccountEnumGroups($sGroup,$sComputer = @ComputerName)
 Local $objGRP = ObjGet("WinNT://"& $sComputer &"/"& $sGroup &",Group")
 Local $iUbound, $asArray[1]
 For $objMember In $objGRP.Members
 	 $iUbound = UBound($asArray)
	 ReDim $asArray[$iUbound + 1]
	 $asArray[$iUbound] = $objMember.Name
 Next
 $asArray[0] = UBound($asArray) - 1
 Return $asArray
EndFunc


; Проверить, является ли пользователь членом группы
Func _AccountIsMember($sUserName,$sGroup,$sComputer = @ComputerName)
    $aEnumGroup=_AccountEnumGroups($sGroup)
    If $aEnumGroup[0]=0 Then Return SetError($IADsError, 0, $IADsError)
    $iIndex=_ArraySearch($aEnumGroup,$sUserName,1)
    if @error Then
        Return SetError($IADsError, 0, $IADsError)
    Else
        Return SetError($IADsError, 0, $IADsError + 1)
    EndIf
EndFunc
 
Автор
V

vuttol

Новичок
Сообщения
2
Репутация
0
Спасибо, pvnn,
второй вариант - это то, что нужно :smile:

в итоге получился у меня такой скрипт
Код:
#include <Array.au3>

; Получить список всех пользователей группы
Func _AccountEnumGroups($sGroup,$sComputer = @ComputerName)
 Local $objGRP = ObjGet("WinNT://"& $sComputer &"/"& $sGroup &",Group")
 Local $iUbound, $asArray[1]
 For $objMember In $objGRP.Members
     $iUbound = UBound($asArray)
     ReDim $asArray[$iUbound + 1]
     $asArray[$iUbound] = $objMember.Name
 Next
 $asArray[0] = UBound($asArray) - 1
 Return $asArray
EndFunc

; Проверить, является ли пользователь членом группы
Func _AccountIsMember($sUserName,$sGroup,$sComputer = @ComputerName)
    $aEnumGroup=_AccountEnumGroups($sGroup)
    $iIndex=_ArraySearch($aEnumGroup,$sUserName,1)
    ; Если пользователь не найден будет -1 иначе индекс найденого элемента массива
    $Return $iIndex
EndFunc

; Добавить доменного пользователя в локальную группу Администараторы
Func _addtoGroup()
   $dso = ObjGet("WinNT:")
   $objGroup = ObjGet("WinNT://" & @ComputerName & "/" & "Администраторы" & ",group")
   $objUser = $dso.OpenDSObject("WinNT://" & <$domen> & "/" & <$user>, <$domen> & "\" & <$DomenAdminName>, <$DomenAdminPas>, 1)
   $index = _AccountIsMember(<$user>, "Администраторы")
   if $index = "-1" Then $objGroup.Add($objUser.ADsPath)
EndFunc

RunAs(<$localAdmin>, @ComputerName, <$LocalAdminpas>, 1, _addtoGroup())
 
Верх