Что нового

[Автоматизация] Операции с пользователями Windows. Задать переменные из файла...

beliy

Продвинутый
Сообщения
372
Репутация
72
Версия AutoIt: 3.3.6.1

Описание:
Нужно написать скрипт который бы находил на ПК локальных админов, которые не должны быть такими и понизить им права... На данный момент проблема вытянуть каждого такого юзера в переменную из файла.

Примечания:

Вот мои наброски:
Код:
#NoTrayIcon
#include <Constants.au3>
#include <Encoding.au3>
#include <File.au3>
$adminlist=@ScriptDir & '\adminlist.lst'
$line=''
$header='Имя псевдонима     Администраторы' & @CRLF & 'Комментарий        Администраторы имеют полные, ничем не ограниченные права доступа к компьютеру или домену' & @CRLF &  @CRLF & 'Члены' & @CRLF &  @CRLF & '-------------------------------------------------------------------------------'
if FileExists($adminlist) Then
    $iMsgBoxAnswer= MsgBox(36,@ScriptName,'Файл ' & $adminlist &' уже существует в папке с програмой!' & @CRLF & 'Хотите удалить данный файл и продолжить!!!',30)
	Select
		Case $iMsgBoxAnswer = 6 ;Yes
		FileDelete($adminlist)
		RunWait(@ComSpec &' /c net localgroup Администраторы >>adminlist.lst','', @SW_HIDE);
		Case $iMsgBoxAnswer = 7 ;No
	Exit
EndSelect

Else
	RunWait(@ComSpec &' /c net localgroup Администраторы >>adminlist.lst','', @SW_HIDE);запись пользователей с правами админимтраторов в файл
EndIf
$userlist=FileOpen($adminlist, 0)
$line=FileRead($userlist)
FileClose($userlist) 
$line = _Encoding_OEM2ANSI($line)
$line = StringReplace($line, $header & @CRLF, ''); шапка файла котороя есть в файле и которая не нужна
$line = StringReplace($line, 'Administrator'& @CRLF, ''); пользователь права которому менять не стоит
$line = StringReplace($line, 'DOMEN\Администраторы домена'& @CRLF, ''); ненужная запись, которая может присутствовать
$line = StringReplace($line, 'Команда выполнена успешно.'& @CRLF & @CRLF, ''); ненужная запись в конце
$line = StringReplace($line, 'Администратор'& @CRLF, ''); пользователь права которому менять не стоит
$userlist=FileOpen($adminlist, 2)
FileWrite($userlist, $line)
MsgBox(0, "", $line)


На этом этапе остаются записи вида:

Код:
user1
user2
...
(пустая строка)

как мне правильно вытащить их в переменные выда $user1 $user2 ... $usern
Также очень приветствуются предложения по улучшению кода... Заранее большое спасибо
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Несколько иное решение.
Взято из этой темы: http://autoit-script.ru/index.php?topic=3203.0
Код:
#include <Array.au3>
Dim $aUsers[1]
$sGroup = "Администраторы" ;группа Администраторы

$oWinNT = ObjGet("WinNT://./"&$sGroup&",Group")
If @error <> 0 Then
	MsgBox(16, "Ошибка", @error&" Возможно значение <"&$sGroup&"> ошибочно.")
	Exit
EndIf
$colItems = $oWinNT.Members
$sResult = ""

For $oItem In $colItems
  $sUser = $oItem.Name
  _ArrayAdd( $aUsers,$sUser)
Next

If UBound($aUsers) > 1 Then
	_ArrayDisplay( $aUsers, "Пользователи с правами <Администраторы>") ;показать значения массива (это для отладки, можно закомментировать)
	For $i = 1 To UBound($aUsers)-1
		ConsoleWrite($aUsers[$i]&@CRLF)
	Next
Else
	MsgBox(48, "Информация", "Нет пользователей с правами "&$sGroup)
EndIf

которые не должны быть такими и понизить им права
Тут не понятно, кому понижать права.
Всем, кроме какого-то?
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Это похоже на Вашу задумку:
Код:
#include <File.au3>
#include <Array.au3>
#include <Encoding.au3>

$AdminList = @ScriptDir & "\adminlist.lst"
RunWait(@ComSpec &' /c net localgroup Администраторы >adminlist.lst','', @SW_HIDE); >adminlist.lst - перезаписать все, >>adminlist.lst - дописать в конец файла
; т.е. в данном случае всегда будет перезаписываться adminlist.lst

Dim $arrAdminList
If _FileReadToArray ($AdminList, $arrAdminList) <> 1 Then
	MsgBox(16, "Ошибка", "Не удалось прочитать файл в массив")
	Exit
EndIf

_ArrayDisplay($arrAdminList, "Админ Лист") ;для отладки (можно отключить)

For $i = 1 To $arrAdminList[0] ;декодируем все строки
	$arrAdminList[$i] = _Encoding_OEM2ANSI($arrAdminList[$i])
Next

_ArrayDisplay($arrAdminList, "Админ Лист декодирован") ;для отладки (можно отключить)

$Begin = "-----------------------" ;начало искомого блока
$End = "Команда выполнена успешно" ;конец искомого блока

$Pos_Begin = SearchPos(1, $arrAdminList[0], $Begin) ;позиция в массиве начала искомого блока
$Pos_End = SearchPos(1, $arrAdminList[0], $End) ;позиция в массиве конца искомого блока

For $i = $Pos_Begin+1 To $Pos_End-1
	ConsoleWrite($arrAdminList[$i]&@CRLF) ;вывод списка пользователей для отладки (можно отключить)
	If $arrAdminList[$i] <> "Administrator" And $arrAdminList[$i] <> "Администратор" Then
		;тут Ваша команда присвоения пользователю иных прав
		MsgBox(64, "Инфо", "Присвоить пользователю " &$arrAdminList[$i]& " иные права") ;для отладки (можно отключить)
	EndIf	
Next

Func SearchPos($j, $To, $Str) ;функция поиска позиций искомого блока в массиве
     For $i = $j To $To
          $Pos = StringInStr($arrAdminList[$i], $Str)
          If $Pos <> 0 Then
               $Pos = $i
               Return $Pos
               ExitLoop               
          EndIf     
     Next     
EndFunc
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
Yuriy сказал(а):
которые не должны быть такими и понизить им права
Тут не понятно, кому понижать права.
Всем, кроме какого-то?
Именно так, это в принципе я указывал в коментах в своих набросках:
$line = StringReplace($line, 'Administrator'& @CRLF, ''); пользователь права которому менять не стоит
и
$line = StringReplace($line, 'Администратор'& @CRLF, ''); пользователь права которому менять не стоит

Спс, 2 вариант более подходит :beer:

Думаю не на всех системах будет работать это:
$oWinNT = ObjGet("WinNT://./"&$sGroup&",Group")

P.S. Ща тестирую готовый скрипт на разных системах - пока гуд... Но для большей юзабельности неплохо бы строку:
Код:
If $arrAdminList[$i] <> "Administrator" And $arrAdminList[$i] <> "Администратор" Then

на что то вроде
Код:
If $arrAdminList[$i] <> "Администратор" And $arrAdminList[$i] <> $allowAdmin[$n] Then

где $allowAdmin[$n] - это другой масив, который опционально мог бы подтягивать с файла список админов которых не нужно трогать...
После всех тестов и доработок - выложу конечный скрипт...
 
Автор
B

beliy

Продвинутый
Сообщения
372
Репутация
72
beliy сказал(а):
для большей юзабельности неплохо бы строку:
Код:
If $arrAdminList[$i] <> "Administrator" And $arrAdminList[$i] <> "Администратор" Then

на что то вроде
Код:
If $arrAdminList[$i] <> "Администратор" And $arrAdminList[$i] <> $allowAdmin[$n] Then

где $allowAdmin[$n] - это другой масив, который опционально мог бы подтягивать с файла список админов которых не нужно трогать...
Что то не получается реализовать работу 2 масивов :(
 
Верх