Под этим способом подразумевается получение списка адресов электронной почты из Active Directory с использованием скрипта VBScript и передача этого списка в Delphi программу для дальнейшей обработки.
Теперь приступим к реализации этого способа.
Нам необходимо разработать VBScript для получения списка адресов электронной почты из Active Directory. Назовём этот скрипт main.vbs.
Ниже показан код скрипта main.vbs:
Теперь пройдемся вкратце по коду скрипта main.vbs и функции GetADMailString
1. Объявляем необходимые переменные для работы скрипта, смотрите часть кода ниже:
On Error Resume Next
Dim adoCommand, adoConnection, strBase, strFilter, strAttributes
Dim objRootDSE, strDNSDomain, strQuery, adoRecordset, strMail
Dim strResult
2. Осуществляем подключение к Active Directory
' Setup ADO objects.
Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
Set adoCommand.ActiveConnection = adoConnection
3. Получаем домен по умолчанию
' Search entire Active Directory domain.
Set objRootDSE = GetObject("LDAP://RootDSE")
If Err.Number <> 0 Then
GetADMailString = ""
Else
strDNSDomain = objRootDSE.Get("defaultNamingContext")
strBase = "<LDAP://" & strDNSDomain & ">"
4. Формируем запрос и выполняем его для получения строки со всеми почтовыми адресами из Active Directory
' Filter on user objects.
strFilter = "(&(objectCategory=person)(objectClass=user) (mail=*))"
' Comma delimited list of attribute values to retrieve.
strAttributes = "mail"
' Construct the LDAP syntax query.
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 100
adoCommand.Properties("Timeout") = 30
adoCommand.Properties("Cache Results") = False
' Run the query.
Set adoRecordset = adoCommand.Execute
5. Формируем строку из всех почтовых адресов
' Enumerate the resulting recordset.
Do Until adoRecordset.EOF
' Retrieve values and display.
strMail = adoRecordset.Fields("mail").Value
If strMail <> "" Then
strResult = strResult & strMail & vbCrLf
End if
' Move to the next record in the recordset.
adoRecordset.MoveNext
Loop
6. Закрываем соединение с Active Directory и возвращаем результат выполнения скрипта main.vbs
' Clean up.
adoRecordset.Close
adoConnection.Close
GetADMailString = strResult
end if
end function
Так со скриптом main.vbs мы разобрались. Теперь нам необходимо передать результат выполнения скрипта в нашу программу и сохранить все почтовые адреса в текстовый файл.
Создайте проект на в среде Delphi 7 и сохраните его под именем p22.dpr. Основной модуль программы сохраните под именем p22_unit1.pas. Файл скрипта main.vbs должен лежать в той же директории, что и файл проекта, и исполняемый файл программы.
На форму с именем Form1 необходимо перетащить компонент ScriptControl. Я уже писал, как установить данный компонент и задействовать его в проекте (Смотрите статью http://notidealrunner.blogspot.com/2019/05/vbscripts-delphi.html). Вкратце опишу основные моменты работы программы.
1. В обработчике показа формы мы проверяем существует ли скрипт main.vbs, открываем его на чтение, считываем его построчно.
procedure TForm1.FormShow(Sender: TObject);
var
ScriptFile: TextFile;
Script, LineScript: String;
SA : TSafeArrayBound;
pPar:PSafeArray;
res:Variant;
begin
AssignFile(ScriptFile,'main.vbs');
Reset(ScriptFile);
if IOResult <> 0 then
begin
MessageBox(0,'File access error.','Error',0);
exit;
end;
while not EOF(ScriptFile) do
begin
readln(ScriptFile, LineScript);
Script := Script + LineScript+#13+#10;
end;
CloseFile(ScriptFile);
2. Далее выполняем скрипт mian.vbs и функцию GetADMailString. Получаем результат выполнения скрипта и сохраняем в строковую переменную strTemp.
try
ScriptControl1.Language := 'VBScript';
ScriptControl1.AddCode(Script);
SA.cElements := 0;
pPar := SafeArrayCreate(varVariant, 1, SA);
res:=ScriptControl1.Run('GetADMailString',pPar);
strTemp := VarToStr(res);
except
on E: Exception do
MessageDlg(PWideChar(E.Message), mtError, [mbOK], 0);
end;
3. Далее передаем строковую переменную strTemp в процедуру сохранения в текстовый файл.
StrToFile('Mail.txt', strTemp);
Ниже код процедуры сохранения строки в файл (Код процедуры взят с сайта https://stackoverflow.com/questions/7752273/how-to-save-a-string-to-a-txt-file-in-delphi).
procedure StrToFile(const FileName, SourceString : string);
var
Stream : TFileStream;
begin
Stream:= TFileStream.Create(FileName, fmCreate);
try
Stream.WriteBuffer(Pointer(SourceString)^, Length(SourceString));
finally
Stream.Free;
end;
end;
Вот и все. Список всех электронных почтовых адресов будет сохранен в файл Mail.txt в директории проекта. Ниже показан код проекта полностью.
Теперь приступим к реализации этого способа.
Нам необходимо разработать VBScript для получения списка адресов электронной почты из Active Directory. Назовём этот скрипт main.vbs.
Ниже показан код скрипта main.vbs:
function GetADMailString() On Error Resume Next Dim adoCommand, adoConnection, strBase, strFilter, strAttributes Dim objRootDSE, strDNSDomain, strQuery, adoRecordset, strMail Dim strResult ' Setup ADO objects. Set adoCommand = CreateObject("ADODB.Command") Set adoConnection = CreateObject("ADODB.Connection") adoConnection.Provider = "ADsDSOObject" adoConnection.Open "Active Directory Provider" Set adoCommand.ActiveConnection = adoConnection ' Search entire Active Directory domain. Set objRootDSE = GetObject("LDAP://RootDSE") If Err.Number <> 0 Then GetADMailString = "" Else strDNSDomain = objRootDSE.Get("defaultNamingContext") strBase = "<LDAP://" & strDNSDomain & ">" ' Filter on user objects. strFilter = "(&(objectCategory=person)(objectClass=user) (mail=*))" ' Comma delimited list of attribute values to retrieve. strAttributes = "mail" ' Construct the LDAP syntax query. strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree" adoCommand.CommandText = strQuery adoCommand.Properties("Page Size") = 100 adoCommand.Properties("Timeout") = 30 adoCommand.Properties("Cache Results") = False ' Run the query. Set adoRecordset = adoCommand.Execute ' Enumerate the resulting recordset. Do Until adoRecordset.EOF ' Retrieve values and display. strMail = adoRecordset.Fields("mail").Value If strMail <> "" Then strResult = strResult & strMail & vbCrLf End if ' Move to the next record in the recordset. adoRecordset.MoveNext Loop ' Clean up. adoRecordset.Close adoConnection.Close GetADMailString = strResult end if end function
Теперь пройдемся вкратце по коду скрипта main.vbs и функции GetADMailString
1. Объявляем необходимые переменные для работы скрипта, смотрите часть кода ниже:
On Error Resume Next
Dim adoCommand, adoConnection, strBase, strFilter, strAttributes
Dim objRootDSE, strDNSDomain, strQuery, adoRecordset, strMail
Dim strResult
2. Осуществляем подключение к Active Directory
' Setup ADO objects.
Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
Set adoCommand.ActiveConnection = adoConnection
3. Получаем домен по умолчанию
' Search entire Active Directory domain.
Set objRootDSE = GetObject("LDAP://RootDSE")
If Err.Number <> 0 Then
GetADMailString = ""
Else
strDNSDomain = objRootDSE.Get("defaultNamingContext")
strBase = "<LDAP://" & strDNSDomain & ">"
4. Формируем запрос и выполняем его для получения строки со всеми почтовыми адресами из Active Directory
' Filter on user objects.
strFilter = "(&(objectCategory=person)(objectClass=user) (mail=*))"
' Comma delimited list of attribute values to retrieve.
strAttributes = "mail"
' Construct the LDAP syntax query.
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 100
adoCommand.Properties("Timeout") = 30
adoCommand.Properties("Cache Results") = False
' Run the query.
Set adoRecordset = adoCommand.Execute
5. Формируем строку из всех почтовых адресов
' Enumerate the resulting recordset.
Do Until adoRecordset.EOF
' Retrieve values and display.
strMail = adoRecordset.Fields("mail").Value
If strMail <> "" Then
strResult = strResult & strMail & vbCrLf
End if
' Move to the next record in the recordset.
adoRecordset.MoveNext
Loop
6. Закрываем соединение с Active Directory и возвращаем результат выполнения скрипта main.vbs
' Clean up.
adoRecordset.Close
adoConnection.Close
GetADMailString = strResult
end if
end function
Так со скриптом main.vbs мы разобрались. Теперь нам необходимо передать результат выполнения скрипта в нашу программу и сохранить все почтовые адреса в текстовый файл.
Создайте проект на в среде Delphi 7 и сохраните его под именем p22.dpr. Основной модуль программы сохраните под именем p22_unit1.pas. Файл скрипта main.vbs должен лежать в той же директории, что и файл проекта, и исполняемый файл программы.
На форму с именем Form1 необходимо перетащить компонент ScriptControl. Я уже писал, как установить данный компонент и задействовать его в проекте (Смотрите статью http://notidealrunner.blogspot.com/2019/05/vbscripts-delphi.html). Вкратце опишу основные моменты работы программы.
1. В обработчике показа формы мы проверяем существует ли скрипт main.vbs, открываем его на чтение, считываем его построчно.
procedure TForm1.FormShow(Sender: TObject);
var
ScriptFile: TextFile;
Script, LineScript: String;
SA : TSafeArrayBound;
pPar:PSafeArray;
res:Variant;
begin
AssignFile(ScriptFile,'main.vbs');
Reset(ScriptFile);
if IOResult <> 0 then
begin
MessageBox(0,'File access error.','Error',0);
exit;
end;
while not EOF(ScriptFile) do
begin
readln(ScriptFile, LineScript);
Script := Script + LineScript+#13+#10;
end;
CloseFile(ScriptFile);
2. Далее выполняем скрипт mian.vbs и функцию GetADMailString. Получаем результат выполнения скрипта и сохраняем в строковую переменную strTemp.
try
ScriptControl1.Language := 'VBScript';
ScriptControl1.AddCode(Script);
SA.cElements := 0;
pPar := SafeArrayCreate(varVariant, 1, SA);
res:=ScriptControl1.Run('GetADMailString',pPar);
strTemp := VarToStr(res);
except
on E: Exception do
MessageDlg(PWideChar(E.Message), mtError, [mbOK], 0);
end;
3. Далее передаем строковую переменную strTemp в процедуру сохранения в текстовый файл.
StrToFile('Mail.txt', strTemp);
Ниже код процедуры сохранения строки в файл (Код процедуры взят с сайта https://stackoverflow.com/questions/7752273/how-to-save-a-string-to-a-txt-file-in-delphi).
procedure StrToFile(const FileName, SourceString : string);
var
Stream : TFileStream;
begin
Stream:= TFileStream.Create(FileName, fmCreate);
try
Stream.WriteBuffer(Pointer(SourceString)^, Length(SourceString));
finally
Stream.Free;
end;
end;
Вот и все. Список всех электронных почтовых адресов будет сохранен в файл Mail.txt в директории проекта. Ниже показан код проекта полностью.
unit p22_unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, MSScriptControl_TLB, ActiveX; type TForm1 = class(TForm) ScriptControl1: TScriptControl; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure StrToFile(const FileName, SourceString : string); var Stream : TFileStream; begin Stream:= TFileStream.Create(FileName, fmCreate); try Stream.WriteBuffer(Pointer(SourceString)^, Length(SourceString)); finally Stream.Free; end; end; var strTemp: String; procedure TForm1.FormShow(Sender: TObject); var ScriptFile: TextFile; Script, LineScript: String; SA : TSafeArrayBound; pPar:PSafeArray; res:Variant; begin AssignFile(ScriptFile,'main.vbs'); Reset(ScriptFile); if IOResult <> 0 then begin MessageBox(0,'File access error.','Error',0); exit; end; while not EOF(ScriptFile) do begin readln(ScriptFile, LineScript); Script := Script + LineScript+#13+#10; end; CloseFile(ScriptFile); try ScriptControl1.Language := 'VBScript'; ScriptControl1.AddCode(Script); SA.cElements := 0; pPar := SafeArrayCreate(varVariant, 1, SA); res:=ScriptControl1.Run('GetADMailString',pPar); strTemp := VarToStr(res); except on E: Exception do MessageDlg(PWideChar(E.Message), mtError, [mbOK], 0); end; StrToFile('Mail.txt', strTemp); end; end.
Комментариев нет:
Отправить комментарий