Что нового

Взаимодействие с AD. Удалить устаревшие ПК в AD

Timerlan

Новичок
Сообщения
93
Репутация
0
Здравствуйте много уважаемые гуру. Помогите пожалуйста написать скриптик которые будет взаимодействовать с Active Directory. Я хочу в итоге получить скрипт который будет вытаскивать мне ПК которые устарели и не проявляют допустим активности 60 дней. И еще чтоб это происходило не на самом сервере(ну в смысле в том, чтоб я физически не сидел на этом сервере) а я сидел за своим ПК и просто подключался к AD с помощью скрипта и он мне находил все эти ПК И все эти данные например записывались в какой txt файл. Вот такая вот непростая задача на мой взгляд, может конечно это не совсем сложно просто я пока даже не предполагаю с чего начать и ваще возможно ли такое? Закачал UDF для AD. вот то что я пока сделал)))) Помогите пожалуйста
 

beliy

Продвинутый
Сообщения
372
Репутация
72
когда то делал для себя, но только устаревшие ПК у меня были записаны в xlsx другой утилитой (уже не помню названия). Далее мой скрипт считывал с xlsx в массив и оттуда блокировал их непосредственно с моего ПК (даж не компилировал скрипт)

Собственно сам скрипт:
Код:
#include <Excel.au3>
#include <Array.au3>
#include <AD.au3>

$s_FilePath = @ScriptDir & '\1.xlsx';файл Excel
$f_Visible = 0 ; 0 - в скрытом режиме, 1 - в открытом
$i_Sheet = 1 ; номер листа
$i_StartRow = 1 ;номер начальной строки
$i_StartColumn = 1 ;номер начальной колонки (3 - С)
$i_RowCnt = 0 ; 0 - строки считаем до последней заполненной ячейки, если не 0, то см. ниже
$i_ColCnt = 1 ;кол-во колонок, если 0, то см. выше
$o_Excel = _ExcelBookOpen($s_FilePath, $f_Visible)
If @error Then
    MsgBox(16, 'Error', @error)
    Exit
EndIf
_ExcelSheetActivate($o_Excel, $i_Sheet)
If @error Then
    _ExcelBookClose($o_Excel)
    MsgBox(16, 'Error', @error)
    Exit
EndIf
$a_ReturnArray = _ExcelReadSheetToArray($o_Excel, $i_StartRow, $i_StartColumn, $i_RowCnt, $i_ColCnt)
If @error Then
    _ExcelBookClose($o_Excel)
    MsgBox(16, 'Error', @error)
    Exit
EndIf
_ExcelBookClose($o_Excel)
;_ArrayDisplay($a_ReturnArray)
_AD_Open()

For $i = 1 To $a_ReturnArray[0][0]
    For $j = 1 To $a_ReturnArray[0][1]
        ;Global $iValue = MsgBox(64, $i & 'x' & $j, $a_ReturnArray[$i][$j])
        Global $iValue = _AD_DisableObject($a_ReturnArray[$i][$j])
		 If $iValue = 1 Then
			ConsoleWrite("Object " & $a_ReturnArray[$i][$j] & " successfully changed"& @CRLF)
		 ElseIf @error = 1 Then
			ConsoleWrite("Object " & $a_ReturnArray[$i][$j] & " does not exist"& @CRLF)
		 Else
			ConsoleWrite("Return code " & @error & " from Active Directory"& @CRLF)
		 EndIf
    Next
 Next
 
 _AD_Close()


Вместо чтения с .xlsx можешь разобраться с считыванием параметра lastLogon или lastLogonTimeStamp, перевести значения в читабельный вид, и если дата меньше указанной добавлять в массив. А из массива уже как на примере выше...
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
Это немножечко не то на мой взгляд мне просто надо найти их и все а дальше уже можно ручками их удалить.
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
Че никто не знает, чтоли как это можно реализовать? Может начнем хотя бы а потом придут какие нибудь мысли.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Timerlan [?]
допустим активности 60 дней
как это узнать вы знаете? т.е откуда скрипт сможет узнать, что машина не проявляла активность в течении 60 дней?
 

beliy

Продвинутый
Сообщения
372
Репутация
72
как это узнать вы знаете? т.е откуда скрипт сможет узнать, что машина не проявляла активность в течении 60 дней?
уже написал выше - нужно считать атрибут lastLogon или lastLogonTimeStamp + перевести его в читабельный вид.

если не посредственно на сервере то можно так -
Код:
dsquery computer -inactive 24 -limit 10000 > C:\result.txt

или утилитами типа - http://www.joeware.net/freetools/tools/oldcmp/
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
Я знаю что так можно через cmd смотреть а как это можно реализовать на AutoIt.
dsquery computer -inactive 24 -limit 10000 > C:\result.txt
С этими параметрами можно не тока непосредственно на сервера AD смотреть, можно и на локальном компе прогоняешь он находит у меня домен нормально срабатывает вроде.
Тока вот это все через AutoIt реализовать???
 

Futurebear

Знающий
Сообщения
29
Репутация
6
Коротко и урезано:
1 Выполняешь свою команду
Код:
$sRead = ''
$iPID = Run(@ComSpec & ' /C  dsquery computer -inactive 24 -limit 10000', @SW_HIDE, $STDOUT_CHILD)

		If Not $iPID Then
			MsgBox(16, 'Error', 'Error')
			Exit
		EndIf
$sRead &= StdoutRead($iPID) ;читаешь данные с cmd
; Возможно нужно будет изменить кодировку #include <Encoding.au3>  
;$sRead = _Encoding_866To1251($sRead)   

;получашь массив с пк 
$aArray_pc = StringSplit($sRead, 'правило разбиения' )
затем в цикле удаляешь, ну или сохраняешь в файл или еще чего


2 Вот VBS скрипт удаления ПК (осбоых трудностей перевода в autoit не должен вызвать, хотя кто его знает)
Код:
' Delete a Computer Account

strComputer = "atl-pro-040"

Set objComputer = GetObject("LDAP://CN=" & strComputer & ",CN=Computers,DC=fabrikam,DC=com")
objComputer.DeleteObject (0)
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
Вот эта часть скрипта не выполняется
Код:
$sRead = ''
$iPID = Run(@ComSpec & ' /C  dsquery computer -inactive 24 -limit 10000', @SW_HIDE, $STDOUT_CHILD) , Ругается вот на эту строку

        If Not $iPID Then
            MsgBox(16, 'Error', 'Error')
            Exit
        EndIf
$sRead &= StdoutRead($iPID) ;читаешь данные с cmd
; Возможно нужно будет изменить кодировку #include <Encoding.au3>  
;$sRead = _Encoding_866To1251($sRead)  

;получашь массив с пк
$aArray_pc = StringSplit($sRead, 'правило разбиения' )



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

А можешь весь скрипт дать нет? не коротко
 

Futurebear

Знающий
Сообщения
29
Репутация
6
Вот, но надо допиливать. Хотя удалять удаляет.
Код:
#include <Array.au3>
#include <Constants.au3>
#include <Encoding.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListviewConstants.au3>
#include <GUIListBox.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#Region ### START Koda GUI section ### Form=
$Form2 = GUICreate("Удаление ПК", 433, 610, 283, 132)
$Button1 = GUICtrlCreateButton("Найти ПК", 29, 39, 175, 25)
$Button2 = GUICtrlCreateButton("Удалить ПК", 229, 39, 175, 25)
$List1 =  GUICtrlCreateListView("Пометить на удаление|Полное имя ПК", 16, 96, 401, 500)

$Label2 = GUICtrlCreateLabel("", 14, 75, 400, 17)
_GUICtrlListView_SetColumnWidth($List1, 0, 160)
_GUICtrlListView_SetColumnWidth($List1, 1, 220)
 _GUICtrlListView_SetExtendedListViewStyle($List1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_CHECKBOXES))
$Graphic1 = GUICtrlCreateGraphic(0, 576, 832, 32)
GUICtrlSetBkColor(-1, 0x646464)
GUICtrlCreateGraphic(0, 0, 832, 12)
GUICtrlSetBkColor(-1, 0x646464)

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
 _GUICtrlListView_RegisterSortCallBack($List1)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			_GetPC()
		Case $Button2
			_CheckPCtoDell()
;~ 			_DellPC("")
;~ 		_GetPC1()
		Case $List1
			 _GUICtrlListView_SortItems($List1,  GUICtrlGetState($List1))	
	EndSwitch
WEnd

Func _GetPC()
	
	$sRead=""
	dim $aResult[1]

	$iPID = Run(@ComSpec & ' /C dsquery computer -inactive 24 -limit 10' , '', @SW_HIDE, $STDOUT_CHILD)

	If Not $iPID Then
		MsgBox(16, 'Error', 'Error')
		Exit
	EndIf

	While 1
		$sRead &= StdoutRead($iPID)

		If @error Then ExitLoop
		
		Sleep(10)

		ConsoleWrite($sRead)
		$aRead = StringSplit ($sRead,'"',3)
		
	WEnd
;~ 	ConsoleWrite($sRead)

	$count=1
	FOR $i=1 to UBound($aRead)-1 Step 2

		  $iIndex = _GUICtrlListView_AddItem($List1,  ""  ,0, $i)
		 $count=$count+1
		  _GUICtrlListView_AddSubItem($List1, $iIndex, _Encoding_866To1251($aRead[$i]),1,  $i)
		  
	 next

EndFunc

Func _CheckPCtoDell()
;~ 	$aPCtoDEL=GUICtrlRead($List1)
	For $j=0 to _GUICtrlListView_GetItemCount($List1)-1
		if (_GUICtrlListView_GetItemChecked($List1,$j)==True)Then _DellPC(_GUICtrlListView_GetItemText($List1,$j,1), $j)
		Next
		MsgBox(0,"","ПК выбранные удалены")
;~ 	_ArrayDisplay($aPCtoDEL)
EndFunc
Func _DellPC($sNamePC,$j)
	
;~ 	ConsoleWrite($sNamePC&@CRLF)

		
 	$objComputer = ObjGet("LDAP://"&$sNamePC)
	$objComputer.DeleteObject(0)
	
EndFunc
 

Sergeichan

Новичок
Сообщения
1
Репутация
0
подскажите, как скорректировать скрипт чтобы удалить из АД информацию lastlogon,
 
Верх