Что нового

[Данные, строки] Сверка данных из выгрузки 1С с данными Active Directory

ildar

Осваивающий
Сообщения
252
Репутация
30
Для облегчения своей работы (системный администратор), написал данный скрипт. Запускается через назначенные задания с сентября 2014, но примерно раз в месяц выдает данные которых по логике не должно быть.
Обработка (сравнение) идет отдельно: Табельный номер, Должность, Отдел и т.д. Каким то образом из массива выгрузки 1С(колонка табельный номер), данные ячейки перемещаются в ячейку должность и поэтому скрипт изменяет должность учетной записи на табельный номер. Тоже самое может произойти с Должность и Отдел. При повторном запуске все встает на свои места. Мониторил 2 недели(запускал вручную с выводом _ArrayDisplay), но за это время не было подобных ошибок.
Как сказал C2H5OH
ildar, ты или самоучка, или очень крут...
http://autoit-script.ru/index.php?topic=18498.msg111866#msg111866
Да, я самоучка, поэтому мог допустить какую-нибудь ошибку, которую я не вижу в своем скрипте.
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compile_Both=y
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Excel.au3>
#include <Array.au3>
#include <Constants.au3>
#Include <file.au3>

;##################################
; Variables
;##################################
$SmtpServer = "mail.co.essen"
$FromName = "Сравнение данных из ЗУП с Active Directory"
$FromAddress = "********"
$ToAddress = "*********"
$Subject = "Сравнение данных из ЗУП с Active Directory"
$Body = "текст"
$AttachFiles = ""
$CcAddress = ""
$BccAddress = ""
$Importance = "Normal"
$Username = "*****"
$Password = "*****"
$IPPort = 25
$ssl = 0

;##################################
; Script
;##################################

Global $oMyRet[2]
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")

; .........................Проверка файлов выгрузки - дата создания...

$sFilePathOPT = '\\******\Выгрузка сотрудников\Сотрудники_ОПТОВИК.xls'
$sFilePathLOG = '\\*******\Выгрузка сотрудников\Сотрудники_ЛОГИСТИК.xls'
$sFilePathKAM = '\\*******\Выгрузка сотрудников\Сотрудники_КАМИЛЛА.xls'

$sDate = @YEAR & @MON & @MDAY
$iOPT = 0
$iLOG = 0
$iKAM = 0

$aDataOPT = FileGetTime($sFilePathOPT)
If Not @error Then
    $sDataFileOPT = $aDataOPT[0] & $aDataOPT[1] & $aDataOPT[2]
    if $sDataFileOPT <> $sDate Then $iOPT = 1
EndIf

$aDataLOG = FileGetTime($sFilePathLOG)
If Not @error Then
    $sDataFileLOG = $aDataLOG[0] & $aDataLOG[1] & $aDataLOG[2]
    if $sDataFileLOG <> $sDate Then $iLOG = 1
EndIf

$aDataKAM = FileGetTime($sFilePathKAM)
If Not @error Then
    $sDataFileKAM = $aDataKAM[0] & $aDataKAM[1] & $aDataKAM[2]
    if $sDataFileKAM <> $sDate Then $iKAM = 1
EndIf

$aArrayMail = IniReadSection(@ScriptDir & "\AD.ini", "Mail")
$FromName = 'Проверка даты выгружаемых файлов из ЗУП'
$Subject = "Сравнение данных из ЗУП с Active Directory"

If $iOPT + $iLOG + $iKAM > 0 Then
	if $iOPT > 0 Then $rc = _INetSmtpMailCom($SmtpServer, $FromName, $aArrayMail[1][1],$aArrayMail[2][1], '"' & $sFilePathOPT & '"' & ' не обновился', '"' & $sFilePathOPT & '"' & ' не обновился. Дата создания файла = ' & $aDataOPT[2] & '/' & $aDataOPT[1] & '/' & $aDataOPT[0] , '', $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
	if $iOPT > 0 Then $rc = _INetSmtpMailCom($SmtpServer, $FromName, $aArrayMail[1][1],$aArrayMail[3][1], '"' & $sFilePathOPT & '"' & ' не обновился', '"' & $sFilePathOPT & '"' & ' не обновился. Дата создания файла = ' & $aDataOPT[2] & '/' & $aDataOPT[1] & '/' & $aDataOPT[0] , '', $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
	if $iLOG > 0 Then $rc = _INetSmtpMailCom($SmtpServer, $FromName, $aArrayMail[1][1],$aArrayMail[2][1], '"' & $sFilePathOPT & '"' & ' не обновился', '"' & $sFilePathLOG & '"' & ' не обновился. Дата создания файла = ' & $aDataLOG[2] & '/' & $aDataLOG[1] & '/' & $aDataLOG[0] , '', $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
	if $iLOG > 0 Then $rc = _INetSmtpMailCom($SmtpServer, $FromName, $aArrayMail[1][1],$aArrayMail[3][1], '"' & $sFilePathOPT & '"' & ' не обновился', '"' & $sFilePathLOG & '"' & ' не обновился. Дата создания файла = ' & $aDataLOG[2] & '/' & $aDataLOG[1] & '/' & $aDataLOG[0] , '', $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
	if $iKAM > 0 Then $rc = _INetSmtpMailCom($SmtpServer, $FromName, $aArrayMail[1][1],$aArrayMail[2][1], '"' & $sFilePathKAM & '"' & ' не обновился', '"' & $sFilePathKAM & '"' & ' не обновился. Дата создания файла = ' & $aDataKAM[2] & '/' & $aDataKAM[1] & '/' & $aDataKAM[0] , '', $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
	if $iKAM > 0 Then $rc = _INetSmtpMailCom($SmtpServer, $FromName, $aArrayMail[1][1],$aArrayMail[3][1], '"' & $sFilePathKAM & '"' & ' не обновился', '"' & $sFilePathKAM & '"' & ' не обновился. Дата создания файла = ' & $aDataKAM[2] & '/' & $aDataKAM[1] & '/' & $aDataKAM[0] , '', $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
	If @error Then
		MsgBox(0, "Error sending message", "Error code:" & @error & "  Description:" & $rc)
	EndIf
	Exit       ; .........................Если хоть один файл выгрузки со старой датой, то выход из программы...
EndIf

Const $sFIO = 'Фамилия Имя Отчество'
Const $sTabNumberAD = 'Табельный номер из AD', $sPostAD = 'Должность из AD', $sUnitAD = 'Подразделение из AD'
Const $sTabNumberZiK = 'Табельный номер из ZiK', $sPostZiK = 'Должность из ZiK', $sUnitZiK = 'Подразделение из ZiK'
$FromName = "Сравнение данных из ЗУП с Active Directory"

$aArray_exception = IniReadSection(@ScriptDir & "\AD.ini", "AD_exception")      ; массив УЗ, которые не обрабатываются
If @error Then
    MsgBox(4096, "", "Произошла ошибка, возможно отсутствует INI-файл.")
	Exit
Else

EndIf

Dim $oContainer
Dim $oUser,$objItem,$oContainerFilter

$aArray = IniReadSection(@ScriptDir & "\AD.ini", "AD")										; Массив контейнеров для выгрузки
If @error Then
    MsgBox(4096, "", "Произошла ошибка, возможно отсутствует INI-файл.")
	Exit
Else

EndIf

;MsgBox(4096, "", $aArray[0][0])
Local $aResult[1000][7] ; Итоговый массив
Local $aArrayOUT[1000][8] ; Выходной массив

$i=1
For $j =1 to $aArray[0][0]
	$sContainer = $aArray[$j][1]
	$oContainer = ObjGet('LDAP://'&$sContainer) ; Получить ссылку на объект

	; Фильтр, чтобы уменьшить объём возвращаемых данных и увеличить производительность
	Local $avArray[1] = ["User"]                                    ;"User" "Computer" "Group" "LocalGroup" "GlobalGroup" "OrganizationalUnit"
	$oContainer.Filter =$avArray

	For $objItem  In $oContainer
		$aResult[$i][0]=$objItem.company                            ; Организация
		$aResult[$i][1]=StringTrimLeft($objItem.Name,3)             ; ФИО
		$aResult[$i][2]=$objItem.employeeID                         ; Табельный номер
		$aResult[$i][3]=$objItem.title 								; Должность
		$aResult[$i][4]=$objItem.department							; Подразделение
		$aResult[$i][6]=$objItem.distinguishedName					; Полное имя контейнера AD
		$sOU = $aResult[$i][6]
		$aRes = StringRegExp($sOU, 'OU=(.*?),OU=', 3)
		$sName = $aRes[0]
		$aResult[$i][5]= $sName										; Имя контейнера AD
		$i+=1
	Next
Next
	;_ArrayDisplay($aResult)

; .........................Поиск и удаление ячеек массива УЗ,которые не обрабатываются...

	For $i = 0 to UBound($aArray_exception) - 1
		$iIndex = _ArraySearch($aResult,  $aArray_exception[$i][1])
		If @error Then

		Else
			_ArrayDelete($aResult,$iIndex)
		EndIf

	Next

	;_ArrayDisplay($aResult)

; .................Вывод из ЗУП...

$aArrayINI = IniReadSection(@ScriptDir & "\AD.ini", "AD-ZiK")
If @error Then
    MsgBox(4096, "", "Произошла ошибка, возможно отсутствует INI-файл.")
	Exit
Else

EndIf

; .................Считываение из документа по Оптовику в массив ...

;$sFilePathOPT = '\\co-1c02\Выгрузка сотрудников\Сотрудники_ОПТОВИК.xls'
$oExcel = _ExcelBookOpen($sFilePathOPT, 0)
$aArrayOPT = _ExcelReadSheetToArray($oExcel)
_ExcelBookClose($oExcel) ; Закрываем рабочую книгу

; .................Считываение из документа по Эссен Логистик в массив ...

;$sFilePathLOG = '\\co-1c01\Выгрузка сотрудников\Сотрудники_ЛОГИСТИК.xls'
$oExcel = _ExcelBookOpen($sFilePathLOG, 0)
$aArrayLogistik = _ExcelReadSheetToArray($oExcel)
_ExcelBookClose($oExcel) ; Закрываем рабочую книгу

; .................Считываение из документа по Камилле в массив ...

;$sFilePathKAM = '\\co-1c01\Выгрузка сотрудников\Сотрудники_КАМИЛЛА.xls'
$oExcel = _ExcelBookOpen($sFilePathKAM, 0)
$aArrayKamilla = _ExcelReadSheetToArray($oExcel)
_ExcelBookClose($oExcel) ; Закрываем рабочую книгу

; .................Объединение трех массивов в один $aArrayZiK ...

$iX = $aArrayOPT[0][0] + $aArrayLogistik[0][0] + $aArrayKamilla[0][0]
$iY = $aArrayOPT[0][1]


	Dim $aArrayZiK[$iX + 1][$iY]

	For $x = 1 To $aArrayOPT[0][0]
		For $y = 1 To $aArrayOPT[0][1] - 1
		    $aArrayZiK[$x][$y] = $aArrayOPT[$x][$y]
		Next
	Next
	$iOPT = $aArrayOPT[0][0]

	For $x = 1 To $aArrayLogistik[0][0]
		For $y = 1 To $aArrayLogistik[0][1] - 1
		    $aArrayZiK[$x + $iOPT][$y] = $aArrayLogistik[$x][$y]
		Next
	Next
	$iLogistik = $aArrayLogistik[0][0] + $iOPT


	For $x = 1 To $aArrayKamilla[0][0]
		For $y = 1 To $aArrayKamilla[0][1] - 1
		    $aArrayZiK[$x + $iLogistik][$y] = $aArrayKamilla[$x][$y]
		Next
	Next

	; .................Приводим в соответствие подразделение из ЗУП с AD...

	For $i = 1 To $iX
		For $j = 1 To UBound($aArrayINI) - 1
			If $aArrayZiK[$i][6] = $aArrayINI[$j][0] Then $aArrayZiK[$i][5] = $aArrayINI[$j][1]
		Next
	Next

; .................Удаляем пробелы в колонке Табельный номер...

	For $i = 1 To $iX
		$sSpace = StringStripWS($aArrayZiK[$i][3], 8)
		$aArrayZiK[$i][3] = $sSpace
	Next

;_ArrayDisplay($aArrayZiK)


; .................Сравнение данных Табельный номер...

$Row = 0
	For $i = 1 to UBound($aResult) - 1
		 For $j = 1 To Ubound($aArrayZiK) - 1
			If $aResult[$i][1] = $aArrayZiK[$j][2] 	Then
													If  $aResult[$i][2] <> $aArrayZiK[$j][3] Then
														$aArrayOUT[$Row][0] = $aResult[$i][1]        ; ФИО из AD
														$aArrayOUT[$Row][1] = $aResult[$i][2]        ; Табельный номер из AD
														$aArrayOUT[$Row][2] = $aArrayZiK[$j][3]      ; Табельный номер из ZiK
														$aArrayOUT[$Row][7] = $aResult[$i][6]        ; CN
														$Row +=1
													Else
													EndIf
			EndIf
		Next
	Next
;_ArrayDisplay($aArrayOUT)
;MsgBox(4096, "", $Row)

If $Row > 0 Then
; .................Сохраняем расхождения данных Табельный номер в Excel ...
		$iTab = 1
		Local $oExcelOUT = _ExcelBookNew(0)                            ; Создаем новую рабочую книгу

		_ExcelWriteCell($oExcelOUT, $sFIO, 1, 1)
		_ExcelWriteCell($oExcelOUT, $sTabNumberAD, 1, 2)
		_ExcelWriteCell($oExcelOUT, $sTabNumberZiK, 1, 3)

			For $i = 0 to $Row
				For $j = 0 to 2
					_ExcelWriteCell($oExcelOUT, $aArrayOUT[$i][$j], $i + 2, $j + 1)
				Next
			Next

		$oExcelOUT.Columns('A:G' ).EntireColumn.AutoFit             ;колонки A-G
		_ExcelBookSaveAs($oExcelOUT, @ScriptDir & '\Табельный номер', "xls", 0, 1) ; Сохраняем файл
		_ExcelBookClose($oExcelOUT)                                 ; Закрываем рабочую книгу

; .................Исправление данных Табельный номер...

		For $i = 0 to $Row
			$sCN = $aArrayOUT[$i][7]
			$iTabNumber = $aArrayOUT[$i][2]
			$iPID = Run(@ComSpec & ' /C dsmod user ' & '"' & $sCN & '"' & ' -empid ' & '"' & $iTabNumber & '"', '', @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
			;ConsoleWrite(' /C dsmod user ' & '"' & $sCN & '"' & ' -empid ' & '"' & $iTabNumber & '"')
			Sleep(100)
		Next
Else
	$iTab = 0
EndIf

; .................Сравнение данных Должность...
	$Row = 0
	For $i = 1 to UBound($aResult) - 1
		For $j = 1 To Ubound($aArrayZiK) - 1
			If $aResult[$i][1] = $aArrayZiK[$j][2] 	Then
														If  $aResult[$i][3] <> $aArrayZiK[$j][4] Then
														$aArrayOUT[$Row][0] = $aResult[$i][1]        ; ФИО из AD
														$aArrayOUT[$Row][1] = $aResult[$i][3]        ; Должность из AD
														$aArrayOUT[$Row][2] = $aArrayZiK[$j][4]      ; Должность из ZiK
														$aArrayOUT[$Row][7] = $aResult[$i][6]        ; CN
														$Row +=1
													Else
													EndIf
			EndIf
		Next
	Next

;_ArrayDisplay($aArrayOUT, 'Табельный номер')

If $Row > 0 Then
; .................Сохраняем расхождения данных Табельный номер в Excel ...
		$iPost = 1
		Local $oExcelOUT = _ExcelBookNew(0)                            ; Создаем новую рабочую книгу

		_ExcelWriteCell($oExcelOUT, $sFIO, 1, 1)
		_ExcelWriteCell($oExcelOUT, $sPostAD, 1, 2)
		_ExcelWriteCell($oExcelOUT, $sPostZiK, 1, 3)

			For $i = 0 to $Row
				For $j = 0 to 2
					_ExcelWriteCell($oExcelOUT, $aArrayOUT[$i][$j], $i + 2, $j + 1)
				Next
			Next

		$oExcelOUT.Columns('A:G' ).EntireColumn.AutoFit             ;колонки A-G
		_ExcelBookSaveAs($oExcelOUT, @ScriptDir & '\Должность', "xls", 0, 1) ; Сохраняем файл
		_ExcelBookClose($oExcelOUT)                                 ; Закрываем рабочую книгу

; .................Исправление данных Должность...
		For $i = 0 to $Row
			$sCN = $aArrayOUT[$i][7]
			$iTitle = $aArrayOUT[$i][2]
			$iPID = Run(@ComSpec & ' /C dsmod user ' & '"' & $sCN & '"' & ' -Title ' & '"' & $iTitle & '"', '', @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
			;ConsoleWrite(' /C dsmod user ' & '"' & $sCN & '"' & ' -Title ' & '"' & $iTitle & '"')
			Sleep(100)
		Next
Else
	$iPost = 0
EndIf



; .................Сравнение данных Отдел...
$Row = 0
	For $i = 1 to UBound($aResult) - 1
		 For $j = 1 To Ubound($aArrayZiK) - 1
			If $aResult[$i][1] = $aArrayZiK[$j][2] 	Then
													If  $aResult[$i][4] <> $aArrayZiK[$j][5] Then
														$aArrayOUT[$Row][0] = $aResult[$i][1]        ; ФИО из AD
														$aArrayOUT[$Row][1] = $aResult[$i][4]        ; Подразделение из AD
														$aArrayOUT[$Row][2] = $aArrayZiK[$j][5]      ; Подразделение из ZiK
														$aArrayOUT[$Row][7] = $aResult[$i][6]        ; CN
														$Row +=1
													Else
													EndIf
			EndIf
		Next
	Next

	;_ArrayDisplay($aArrayOUT, 'Отдел')

If $Row > 0 Then

; .................Сохраняем расхождения данных Отдел в Excel .........................................................................................


		$iUnit = 1
		Local $oExcelOUT = _ExcelBookNew(0)                            ; Создаем новую рабочую книгу

		_ExcelWriteCell($oExcelOUT, $sFIO, 1, 1)
		_ExcelWriteCell($oExcelOUT, $sUnitAD, 1, 2)
		_ExcelWriteCell($oExcelOUT, $sUnitZiK , 1, 3)

			For $i = 0 to $Row
				For $j = 0 to 2
					_ExcelWriteCell($oExcelOUT, $aArrayOUT[$i][$j], $i + 2, $j + 1)
				Next
			Next

		$oExcelOUT.Columns('A:G' ).EntireColumn.AutoFit             ;колонки A-G
		_ExcelBookSaveAs($oExcelOUT, @ScriptDir & '\Отдел', "xls", 0, 1) ; Сохраняем файл
		_ExcelBookClose($oExcelOUT)                                 ; Закрываем рабочую книгу

; .................Исправление данных Отдел...

		For $i = 0 to $Row
			$sCN = $aArrayOUT[$i][7]
			$iTitle = $aArrayOUT[$i][2]
			$iPID = Run(@ComSpec & ' /C dsmod user ' & '"' & $sCN & '"' & ' -dept ' & '"' & $iTitle & '"', '', @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
			;ConsoleWrite(' /C dsmod user ' & '"' & $sCN & '"' & ' -dept ' & '"' & $iTitle & '"')
			Sleep(100)
		Next
Else
	$iUnit = 0
EndIf

$aArrayMail = IniReadSection(@ScriptDir & "\AD.ini", "Mail")


If $iTab + $iPost + $iUnit > 0 Then
	if $iTab = 1 Then $rc = _INetSmtpMailCom($SmtpServer, $FromName, $aArrayMail[1][1],$aArrayMail[2][1], 'Изменения данных Табельный номер', 'Внимание! Изменения по табельным номерам есть', @ScriptDir & '\Табельный номер.xls', $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
	if $iPost = 1 Then $rc = _INetSmtpMailCom($SmtpServer, $FromName, $aArrayMail[1][1],$aArrayMail[2][1], 'Изменения данных Должность', 'Внимание! Изменения по данным Должность есть', @ScriptDir & '\Должность.xls', $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
	if $iUnit = 1 Then $rc = _INetSmtpMailCom($SmtpServer, $FromName, $aArrayMail[1][1],$aArrayMail[2][1], 'Изменения данных Отдел', 'Внимание! Изменения по данным Отдел есть', @ScriptDir & '\Отдел.xls', $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
	If @error Then
		MsgBox(0, "Error sending message", "Error code:" & @error & "  Description:" & $rc)
	EndIf
Else
	$Body = "Изменений в ЗУП нет"
	$AttachFiles = ''
	$Subject = 'Изменнений в ЗУП нет'
	$rc = _INetSmtpMailCom($SmtpServer, $FromName, $aArrayMail[1][1],$aArrayMail[2][1], $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
	If @error Then
		MsgBox(0, "Error sending message", "Error code:" & @error & "  Description:" & $rc)
	EndIf
EndIf


; .................Сравнение данных Отдел ЗУП  и контейнер в AD...
$Row = 0
$iCont = 0
	For $i = 1 to UBound($aResult) - 1
		 For $j = 1 To Ubound($aArrayZiK) - 1
			If $aResult[$i][1] = $aArrayZiK[$j][2] 	Then
													If  $aResult[$i][5] <> $aArrayZiK[$j][5] And $aResult[$i][5] <> 'Пользователи' Then
														$aArrayOUT[$Row][0] = $aResult[$i][1]        ; ФИО из AD
														$aArrayOUT[$Row][1] = $aResult[$i][5]        ; Подразделение из AD
														$aArrayOUT[$Row][2] = $aArrayZiK[$j][5]      ; Подразделение из ZiK
														$aArrayOUT[$Row][7] = $aResult[$i][6]        ; CN
														$Row +=1
														$iCont = 1
													Else
													EndIf
			EndIf
		Next
	Next

	;_ArrayDisplay($aArrayOUT, 'Контейнер')

; .................Сохраняем расхождения данных Отдел в Excel .........................................................................................



		Local $oExcelOUT = _ExcelBookNew(0)                            ; Создаем новую рабочую книгу

		_ExcelWriteCell($oExcelOUT, $sFIO, 1, 1)
		_ExcelWriteCell($oExcelOUT, 'Имя контейнера в AD', 1, 2)
		_ExcelWriteCell($oExcelOUT, $sUnitZiK , 1, 3)

			For $i = 0 to $Row
				For $j = 0 to 2
					_ExcelWriteCell($oExcelOUT, $aArrayOUT[$i][$j], $i + 2, $j + 1)
				Next
			Next

		$oExcelOUT.Columns('A:G' ).EntireColumn.AutoFit             ;колонки A-G
		_ExcelBookSaveAs($oExcelOUT, @ScriptDir & '\Контейнер', "xls", 0, 1) ; Сохраняем файл
		_ExcelBookClose($oExcelOUT)                                 ; Закрываем рабочую книгу

		Sleep(5000)

	if $iCont = 1 Then $rc = _INetSmtpMailCom($SmtpServer, $FromName, $aArrayMail[1][1],$aArrayMail[2][1], 'Проверка на соответствие отдел ЗУП и контейнер в AD', 'Внимание! Есть несоответствие', @ScriptDir & '\Контейнер.xls', $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
	If @error Then
		MsgBox(0, "Error sending message", "Error code:" & @error & "  Description:" & $rc)
	EndIf



; .................Проверка на наличие уволенных ...
	$Row = 0
	$iDel = 0
	For $i = 1 to UBound($aResult) - 1
		$iIndex = _ArraySearch($aArrayZiK,  $aResult[$i][1])
		If @error Then
			$aArrayOUT[$Row][0] = $aResult[$i][1]
			$aArrayOUT[$Row][1] = $aResult[$i][3]        ; Должность из AD
			$aArrayOUT[$Row][2] = $aResult[$i][4]        ; Подразделение из AD
			$Row +=1
			$iDel = 1
		Else
			;MsgBox(4096, 'найден в массиве в позиции ' & $iIndex & ".")
		EndIf

	Next

	;_ArrayDisplay($aArrayOUT, 'Уволенные')

; .................Сохраняем  в Excel ...
	$iPost = 1
	Local $oExcelOUT = _ExcelBookNew(0)                            ; Создаем новую рабочую книгу

	_ExcelWriteCell($oExcelOUT, $sFIO, 1, 1)
	_ExcelWriteCell($oExcelOUT, $sPostAD, 1, 2)
	_ExcelWriteCell($oExcelOUT, $sUnitAD, 1, 3)

	For $i = 0 to $Row
		For $j = 0 to 2
			_ExcelWriteCell($oExcelOUT, $aArrayOUT[$i][$j], $i + 2, $j + 1)
		Next
	Next

	$oExcelOUT.Columns('A:G' ).EntireColumn.AutoFit             ;колонки A-G
	_ExcelBookSaveAs($oExcelOUT, @ScriptDir & '\Уволенные', "xls", 0, 1) ; Сохраняем файл
	_ExcelBookClose($oExcelOUT)                                 ; Закрываем рабочую книгу
	Sleep(5000)

	if $iDel = 1 Then $rc = _INetSmtpMailCom($SmtpServer, $FromName, $aArrayMail[1][1],$aArrayMail[2][1], 'Проверка на наличие уволенных', 'Внимание! Есть предполагаемые уволенные', @ScriptDir & '\Уволенные.xls', $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
	If @error Then
		MsgBox(0, "Error sending message", "Error code:" & @error & "  Description:" & $rc)
	EndIf

; The UDF
Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
    Local $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then
        $objEmail.HTMLBody = $as_Body
    Else
        $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
        For $x = 1 To $S_Files2Attach[0]
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
;~          ConsoleWrite('@@ Debug : $S_Files2Attach[$x] = ' & $S_Files2Attach[$x] & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
            If FileExists($S_Files2Attach[$x]) Then
                ConsoleWrite('+> File attachment added: ' & $S_Files2Attach[$x] & @LF)
                $objEmail.AddAttachment($S_Files2Attach[$x])
            Else
                ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)
                SetError(1)
                Return 0
            EndIf
        Next
    EndIf
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 then $IPPort = 25
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $ssl Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
        Case "High"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "High"
        Case "Normal"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Normal"
        Case "Low"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Low"
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
        SetError(2)
        Return $oMyRet[1]
    EndIf
    $objEmail=""
 EndFunc   ;==>_INetSmtpMailCom
 ;
;
; Com Error Handler
Func MyErrFunc()
    $HexNumber = Hex($oMyError.number, 8)
    $oMyRet[0] = $HexNumber
    $oMyRet[1] = StringStripWS($oMyError.description, 3)
    ConsoleWrite("### COM Error !  Number: " & $HexNumber & "   ScriptLine: " & $oMyError.scriptline & "   Description:" & $oMyRet[1] & @LF)
    SetError(1); something to check for when this function returns
    Return
EndFunc   ;==>MyErrFunc
Если кто-нибудь укажет на ошибки, буду очень благодарен.
 
Автор
ildar

ildar

Осваивающий
Сообщения
252
Репутация
30
За год, если не изменяет память, было 2-3 косяка. Это не критично. Тему отмечаю решенной.
 
Верх