PDA

Показать полную графическую версию : [Архив - Часть 1.2] AutoIt скрипты


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [24] 25 26

amel27
10-11-2006, 08:32
Creat0RУдаляются не все дублирующиеся блоки ёлы-палы, такую грубую ошибку прозевал!... :blush: функция _DupURLsInArray возвращала неотсортированные данные, а это как известно перепутывает индексы при удалении, профиксил (http://forum.oszone.net/post-508967-458.html).

Ладно, коли такое дело :) переделал функцию - теперь она возвращает начало и конец продублированных блоков (от содержания строки отказался, т.к. невостребовано). Далее - предыдущий вариант страдал нелогичностью по отношению к операциям ввода-вывода, то смотрим в массив, то в файл.... зачем тогда было его загружать?.. Поэтому все операции с файлом (в т.ч. удаление строк) переделал для массива, в заключении готовый массив выгружается поверх старого файла:#include <File.au3>
#include <Array.au3>

$File = "c:\test.txt"

Dim $FileLines
_FileReadToArray ($file, $FileLines)
; Возвращаем данные о дублирующихся блоках
$DupLines = _DupBLKsInArray ($FileLines, '#URL', @TAB & 'URL=')
; Страховка от пустого массива если дублей нет
If $DupLines [0][0] >0 Then
For $i=$DupLines [0][0] To 1 Step -1
For $j=$DupLines [$i][1] To $DupLines [$i][0] Step -1
_ArrayDelete ($FileLines, $j)
Next
Next
_FileWriteFromArray($File, $FileLines, 1)
EndIf

; Возвращает отсортированный двумерный массив со счетчиком, содержащий
; начало и конец продублированных блоков, в качестве параметров принимаются
; строки, отмечающие начало блока и начало ключевой строки
Func _DupBLKsInArray (ByRef $array, $BlkStartLine, $BlkKeyLine)
Local $i, $i, $BlkStart, $res [1][2] = [[0,0]]
Local $BlkStartLen= StringLen ($BlkStartLine)
Local $BlkKeytLen = StringLen ($BlkKeyLine)
; рабочий массив для отметки обработанных дублей
Local $flags [$array [0] +1]
For $i=1 To $array [0]
If StringLeft ($array [$i], $BlkKeytLen) = $BlkKeyLine Then
For $j=$i+1 To $array [0]
If StringLeft ($array [$j], $BlkStartLen) = $BlkStartLine Then
; отмечаем начало текущего блока
$BlkStart = $j
; если у текущего дубля нет конца, значит это он и есть
If $res [$res [0][0]][1] =0 Then $res [$res [0][0]][1] = $BlkStart -1
EndIf
If $flags [$j] <> 1 Then
If $array [$i] = $array [$j] Then
ReDim $res [$res [0][0]+2][2]
$res [0][0] = $res [0][0] +1
; вспоминаем начало текущего блока
$res [$res [0][0]][0] = $BlkStart
$res [$res [0][0]][1] = 0
$flags [$j] = 1
EndIf
EndIf
Next
; если конца до сих пор не нашли, значит этот блок последний
If $res [$res [0][0]][1] =0 Then $res [$res [0][0]][1] = $j-1
EndIf
Next
; сортировка массива по возрастанию
_ArraySort ($res, 0, 1, 0, 2)
Return $res
EndFunc

TERMINAL
10-11-2006, 11:20
:help: :help: :help: H E L P ! ! ! :help: :help: :help:
Написал кучу скриптов с помощью AutoIt и тут вдруг обновляется Dr.WEB и начинает запрещать работать с этим прекрасным редактором.
Начал проверять свои рабочие скрипты-на половину все заражённые вирусом BackDoor.Hengto :vampire:.Скачал с оф.сайта опять эту прогу-проверил (в ней вирусы зашиты). Так почему же тогда раньше ВЕБ не кричал и почему не все тогда скрипты заражены??!! или у меня на компе просто глюк???

XXXler
10-11-2006, 13:52
TERMINAL, у меня Nod32 одно время обзывал скрипт для генерации Inf как Trojan.Autoit.A - потом прошло... Хотя хз, мож ты чего-то и хватанул

Sanja Alone
10-11-2006, 13:58
TERMINAL
в ней вирусы зашиты
Нет в AutoIt вируса (для очистки совести проверил Dr.Web-ом, обновленным сегодня). Это у тебя на компе зараза поселилась и уже расползается...

почему не все тогда скрипты зараженыНу, наверное здоровые скрипты ты компилировал до заражения компа вирусягой.

TERMINAL
10-11-2006, 14:02
Да не должен подхватить-2 антивирусника стоят...
Облазил весь инет, попровирял разными антивирусниками-все отвечают что файл ОК - незаражон...,а ВЕБ орёт и блокирует.
Может это у него такая реакция на скрипт??????,правда он не может сказать что файл якобы ВОЗМОЖНЫЙ ВИРУС-просто берёт и блокирует....У кого то такое было????????просто хочется быть уверенным что это из-за скрипта, а не вирус...

TERMINAL
10-11-2006, 14:41
Sanja Alone Я скачиваю повторно файл установки AutoIt с оф.сайта-начинаю устанавливать и ВЕБ начинает орать опять на установочные файлы.
НАРОД ПЛЗ !
Пришлите мне какой нибудь скрипт "ехе" упакованый с "au3" на trm6@mail.ru , а я его проверю....

Creat0R
11-11-2006, 01:02
amel27
Всё работает как по маслу! Огромное Мерсий! :pray:

TERMINAL
У меня тоже на несколько закомпилированных скриптов, Dr.Web ругается на вирус BackDoor.Hengto - Наверно это из за структуры самого скрипта. Но это не значит что там есть вирус, это значит что Dr.Web (и ему подобные) не достаточно “умный” (при всё уважении к нему :) ), чтобы определить является ли это действительно вирусром, и просто напросто перестроаховывается. У меня стоит последний Kaspersky, он молчит, также молчат проверки online, так что это глюк в этой базе данных доктора ;) (имхо).

Creat0R
12-11-2006, 22:58
amel27
Есть небольшая пролблема с функцией, которую ты написал (http://forum.oszone.net/showthread.php?p=487997#post488300) для проверки подключённости к интернету :( ...

При проверке синтаксиса в SciTE, выдаётся ошибка, а именно, эта строка подчёркнута как ошибочная:

SetError(err.number)

Мне нужно чтобы в случае не подключения, функция лишь возвращала уровень ошибочности (@Error = 1), и чтобы также можно былло проверть, если @error = 1, значит вывожу сообщение (не в функции, а в теле скрипта), и в нём сообщаю о том какая ошибка произошла (значение ошибки должно тоже возвращаться из функции).

amel27
13-11-2006, 12:26
Creat0R
опечатку исправил... только почему-то на моем компе она перестала работать - вываливает ошибку таймаута и все тут, хотя точно знаю что все работало!... уже и PROXYCFG проверил - ничего не помогает... ладно, сейчас некогда ковыряться может позже разберусь в чем причина.если @error = 1, значит вывожу сообщение (не в функции, а в теле скрипта), и в нём сообщаю о том какая ошибка произошла (значение ошибки должно тоже возвращаться из функции)Обычно делается так: в норме функция возвращает "0" или там еще что по контексту, если ошибка то "-1" или типа того, при необходимости номер ошибки можно восстановить через @error. Это особенно удобно если функция по задумке должна возвращать полезную информацию - в этом случае возможности передать тип ошибки весьма ограничены...

Creat0R
14-11-2006, 02:22
amel27
Если я сделаю так (см. ниже), будет ли это являться корректной проверкой подключения?


;Установка функции перехвата COM-ошибок
$oMyError = ObjEvent("AutoIt.Error","MyErrFunc")

If IsNotConnect() Then MsgBox (48,"Проверка связи","Интернет-соединение отсутствует по причине:" & @CRLF & $oMyError.description)

;Функция проверки на отсутствие соединения
Func IsNotConnect()
Local $oHTTP=ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET","http://www.google.com")
$oHTTP.Send()

Return @error
EndFunc

;Обработчик COM-ошибок
Func MyErrFunc()
Select
Case $oMyError.source = "WinHttp.WinHttpRequest"
SetError($oMyError.number)
Case Else
Return $oMyError.description
EndSelect
Endfunc



P.S:

Просто интересно, как ты разукрасил код скрипта? :) неужели каждую команду (и разделители) обрамлял тегом цветов и выделения?

amel27
14-11-2006, 06:21
Creat0R
Если речь про функцию MyErrFunc () то она построена некорректно, посуди сам что выходит: если ошибку вызвал модуль "WinHttp.WinHttpRequest" - устанавливаем только код ошибки и ничего не возвращаем, а если любой другой - только возвращаем текст ошибки... Если скрипт не отслеживает другие возможные ошибки кроме HTTP и тебе нужен не только номер, но и текст ошибки лучше сделать иначе;Установка функции перехвата COM-ошибок
$oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
; ...

;Обработчик COM-ошибок
Func MyErrFunc()
SetError($oMyError.number)
Return $oMyError.description
Endfunc... Хотя учитывая, что с одной стороны эта функция единственная для всех возможных событий, а с другой - коды ошибок для любого модуля вполне известны, ключевой информацией является не текст ошибки, а ее номер и источник. Исходя из этой инфы и строятся обработчики ошибок - внутри самой функции MyErrFunc () или в других местах...

P.S. шалость удалась (c) :) ... конечно скриптом - больше ради прикола чем по необходимости,
заодно разобрался с тегами форума и погонял функции StringRegExp*, если есть интерес то могу запостить...
на самом деле все гораздо проще чем кажется. ;)

Creat0R
14-11-2006, 08:25
amel27
В принципе, мне не нужен код ошибки, нужно только описание, т.е если и была ошибка (не важно какая), то нужно сообщать что она была, и по возможности выводить описание этой самой ошибки. И как я понял, используя пример из кода твоего поста (последнего), это оптимальное решение.
Если честно, я смутно понимаю всю работу этой функции, для меня вообще много что связанно с интернетом, пока не очень ясно, я в сети не более полу года нахожусь, и тем более что тут не только о самих понятиях интернета идёт речь, но ещё и о модулях, о которых я только начинаю что то узнавать.

если есть интерес то могу запостить
Конечно есть - Я открыл соответствующий раздел в справке, но мне сразу захотелось её (справку) закрыть. Очень там всё страшно для меня (пока?). Буду благодарен если направиш меня на путь верный :) - У меня получилось корректировать только скобки, точки, запятые, и знаки разделителей и ровно...


$File = @ScriptFullPath
$FileContent = FileRead($File, FileGetSize($File))

$Result = StringRegExpReplace($FileContent, "[=]", "=")
$Result = StringRegExpReplace($Result, "[(]", "(")
$Result = StringRegExpReplace($Result, "[)]", ")")
$Result = StringRegExpReplace($Result, "[.]", ".")
$Result = StringRegExpReplace($Result, "[,]", ",")
$Result = StringRegExpReplace($Result, "[&]", "&")


MsgBox(0, "", $Result)

FileWrite($File & ".res", $Result)

amel27
14-11-2006, 10:31
Creat0R
По поводу раскраски кода (поскольку это решение на AutoIT то имхо не оффтоп) ... Замечу, что лобовое решение требует последовательного разбора всего текста кода по словарю, а это слишком большой объем работ... Но зачем изобретать велосипед, если SciTE4 уже делает это и весьма успешно? Одна из его возможностей - экспорт кода в HTML/XML-формат с сохранением всех стилей, осталось только определить соответствия между стилями XML и форума и произвести замену. Поэтому обработка проходит в два шага: экспорт кода в XML-файл и последующая обработка его скриптом - содержимое полученного TXT-файла (уже с тегами кода) можно публиковать в форуме. Поскольку текст скрипта напичкан всевозможными тегами вынужден прикрепить его отдельным файлом...

P.S. Как видно из текста скрипта я определил еще не все стили (например пропущены 2, 10, 12, 13) и наверняка не все спецсимволы... они мне просто еще не попадались, на этот случай я оставил проверку на полноту замены... если кто обнаружит их раньше просьба сообщить в личку.

линк: http://www.sendspace.com/file/wjwk9r
--------
нормальные герои всегда идут в обход (c) :)

Creat0R
15-11-2006, 00:25
amel27
Файл не скачивается :( - т.е скачивается, но архиватор ругается на то что архив повреждён... может зальёшь на http://www.sendspace.com/ - и\или мне на мыло?

Sanja Alone
15-11-2006, 01:48
Отвечаю на повторяющийся по мылу вопрос. Итак, "Как же определить букву дисковода по маркерному файлу?"

Способ "В лоб":
$TagFile="маркерный файл"
$i = 67
While FileExists( Chr($i) & ":\" & $TagFile )=0 AND $i<=90
$i = $i + 1
WEnd
;искомый дисковод (буква с двоеточием)
$drive=$i & ":"
Способ "В лоб, но с размышлением :)":
$TagFile="маркерный файл"
;на какого типа дисководах искать маркерный файл
;возможные варианты: "ALL", "CDROM", "REMOVABLE", "FIXED", "NETWORK", "RAMDISK", или "UNKNOWN"
$type="CDROM"
$drvlst=DriveGetDrive ( $type )
If not @error Then
For $i = 1 to $drvlst[0]
If FileExists( $drvlst[$i] & "\" & $TagFile ) Then
;искомый дисковод (буква с двоеточием)
$drive=$drvlst[$i]
ExitLoop
EndIf
Next
EndIf
Ес-но, это далеко не все возможные варианты. В зависимости от исходных данных, для решения подобной задачи, весьма полезными могут оказаться ф-ции DriveGetLabel, DriveGetFileSystem, DriveGetSerial, DriveGetType, DriveStatus.

Lodoss
16-11-2006, 18:05
2amel27
Зато теперь можно смело замахнуться на всю линейку NetApi32 (страница 44)
весь сыр бор был из-за GUI авторизации запуска от имени админа.

повторю задачу:
1.Требуется запустить какой либо setup.exe, если пользователь не админ - нарисовать GUI с полем имени и пароля для авторизации запуска (конечно можно воспользоваться стандартным запуском нажав shift но хочется реализовать задачу при помощи AutoIt)
2.В комбо боксе приводим список учёток обладающими правами для установки т. е. админов
3.При неправильном вводе пароля - выдать сообщение об ошибке НЕ закрыв GUI
повторю код


#include <GUIConstants.au3>
Opt("RunErrorsFatal",0)
;что запускать
$what_to_run="setup.exe"
If IsAdmin() Then
;запуск программы
Run($what_to_run)
Else
;если не админ, то "рисуем" GUI
_GUI()
EndIf
Func _GUI()
GUICreate("Авторизация", 198, 125)
;фон окна
GUISetBkColor (0x00E0FFFF)
;лейблы
GUICtrlCreateLabel("Имя администратора", 25, 5)
GUICtrlCreateLabel("Пароль администратора", 25, 50)
;запуск и отмена скрипта
$ok = GUICtrlCreateButton("Ok", 25, 98, 70,20)
$cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20)
;ввод имени
$us = @UserName
$in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20)
GUICtrlSetData($in1, "admin|qwerty|Администратор|Винни-Пух")
GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора")
;ввод пароля
$in2 = GUICtrlCreateInput ("solo11", 25, 70, 150, 20, 0x20)
GUICtrlSetTip(-1,"введите пароль")
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
;считываем введённые данные
$out1 = GUICtrlRead($in1)
$out2 = GUICtrlRead($in2)
Global $user = $out1, $pass = $out2
Select
Case $msg = $ok
;инициализация запуска от имени админа
RunAsSet($user, "", $pass)
;проверка верны ли введённые записи на право обладания правами админа
if IsAdmin() Then
;запуск программы
Run($what_to_run)
If @error Then
MsgBox(16, "Ошибка", "Введен неправильный пароль или отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5)
EndIf
EndIf
;закрытие окна
Case $msg = $cancel
ExitLoop
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
EndSelect
WEnd
EndFunc


третий пункт не выполняется :(
PS с оболочками только только начал разбираться, многое не понимаю. Помогите PLS

Creat0R
16-11-2006, 19:57
Lodoss
третий пункт не выполняется
Что значит не выполняется? не выводится сообщение?

Вот немного изменил - добавил проверку (отдельную) на проавильность ввода пароля (это при условии что пароль заранее известен):


#include <GUIConstants.au3>
Opt("RunErrorsFatal",0)
;что запускать
$what_to_run="setup.exe"

If Not IsAdmin() Then
;запуск программы
Run($what_to_run)
Else
;если не админ, то "рисуем" GUI
_GUI()
EndIf

Func _GUI()
GUICreate("Авторизация", 198, 125)
;фон окна
GUISetBkColor (0x00E0FFFF)
;лейблы
GUICtrlCreateLabel("Имя администратора", 25, 5)
GUICtrlCreateLabel("Пароль администратора", 25, 50)
;запуск и отмена скрипта
$ok = GUICtrlCreateButton("Ok", 25, 98, 70,20)
$cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20)
;ввод имени
$us = @UserName
$in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20)
GUICtrlSetData($in1, "admin|qwerty|Администратор|Винни-Пух")
GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора")
;ввод пароля
$in2 = GUICtrlCreateInput ("solo11", 25, 70, 150, 20, 0x20)
GUICtrlSetTip(-1,"введите пароль")
GUISetState(@SW_SHOW)

While 1
$msg = GUIGetMsg()
;считываем введённые данные
$out1 = GUICtrlRead($in1)
$out2 = GUICtrlRead($in2)
Global $user = $out1, $pass = $out2

Select
Case $msg = $ok
;инициализация запуска от имени админа
RunAsSet($user, "", $pass)
;проверка верны ли введённые записи на право обладания правами админа
If IsAdmin() Then
;проверка правильноти пароля
If $pass <> "solo11" Then
MsgBox(16, "Ошибка", "Введен неправильный пароль"&@LF&@LF&"Попробуйте еще раз.",5)
ContinueLoop
EndIf
;запуск программы
Run($what_to_run)
If @error Then
MsgBox(16, "Ошибка", "Отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5)
ContinueLoop
EndIf
EndIf
;закрытие окна
Case $msg = $cancel or $msg = $GUI_EVENT_CLOSE
ExitLoop
EndSelect
WEnd
EndFunc

Creat0R
17-11-2006, 00:20
amel27
Класный скрипт, как видно в посте чуть выше, я его уже приминил :) - Я тут немного повазился, и немного автоматизировал этот процесс, так что вот, залил (http://files.myopera.com/Creat0R/Scripts/Au3ToPst.zip) ;)

http://img517.imageshack.us/img517/3425/au3topstcs3.png

ПРИМЕЧАНИЕ: После завершения обработки, в первую и вторую строку самого скрипта, прописываются пути к файлу обработки (*.xml) и к выходному файлу (*.txt), и при повторном запуске скрипта, эти значения будут подставляться в соответствующие поля, так что эти строки лучше не трогать (для удобства).

Можно было бы ещё лучше автоматизировать этот процесс, если бы можно было автоматичкский экспортировать указанный скрипт в *.xml формат - может можно как то задать параметры для SciTE, чтобы там в тихом режиме указанный файл экспортировался в нужный формат? Тогда можно было бы сразу указывать скрипт (*.au3), и всё бы происходило автоматом - минимальное вмешательство юзера ;)

Lodoss
17-11-2006, 06:17
Вот немного изменил - добавил проверку (отдельную) на проавильность ввода пароля (это при условии что пароль заранее известен):


Ни учётка администратора ни его пароль НЕ ДОЛЖНЫ быть прописаны в скрипте.
Это я тут в комбо списке написал "Администратор,admin.....так не должно быть. решение КАК выдать список учёток обладающими правами админа есть от amel27 (осталось только разобраться как это привинтить к комбо списку пользователей %) ) а пароль должен ввести только админ.

Что значит не выполняется? не выводится сообщение?

итак снова
1.заходим под обычным пользователем в систему если вводим правильные данные (админа)- запускается сценарий run("setup.exe")....
2.если вводим неправильный пароль то выдаётся сообщение "ошибка" и предлагается ввести пароль заново

в существующем сценарии ошибка выдаётся даже если правильно ввёл пароль и файл setup.exe существует
либо вообще ничего не происходит по нажатии кнопки ОК

Creat0R
17-11-2006, 09:34
Lodoss
Вот рабочий (у меня) вариант (в нём уже включено помещение списка юзеров в combo) :


#include <Array.au3>
#include <GUIConstants.au3>
Opt("RunErrorsFatal",0)

;Узнаём список пользователей
$admins = _AdminUsers()

Dim $AdminList
;Подготавливаем список пользователей для использования в combo
If IsArray($admins) Then
For $i = 1 to $admins[0]
Do
$AdminList = $admins[$i] & "|" & $AdminList
Until $admins[$i] <> $admins[0]
Next
EndIf

;что запускать
$what_to_run="setup.exe"

If IsAdmin() Then
;запуск программы
Run($what_to_run)
Else
;если не админ, то "рисуем" GUI
_GUI()
EndIf

Func _GUI()
GUICreate("Авторизация", 198, 125)
;фон окна
GUISetBkColor (0x00E0FFFF)
;лейблы
GUICtrlCreateLabel("Имя администратора", 25, 5)
GUICtrlCreateLabel("Пароль администратора", 25, 50)
;запуск и отмена скрипта
$ok = GUICtrlCreateButton("Ok", 25, 98, 70,20)
$cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20)
;ввод имени
$us = @UserName
$in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20)
GUICtrlSetData($in1, $AdminList)
GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора")
;ввод пароля
$in2 = GUICtrlCreateInput ("", 25, 70, 150, 20, 0x20)
GUICtrlSetTip(-1,"введите пароль")
GUISetState(@SW_SHOW)

While 1
$msg = GUIGetMsg()
;считываем введённые данные
$User = GUICtrlRead($in1)
$Password = GUICtrlRead($in2)

Select
Case $msg = $ok
;Проверка был ли введён пароль вообще
If $Password = "" Then
MsgBox(48, "Ошибка", "Не был введён пароль")
ContinueLoop
EndIf

;инициализация запуска от имени админа
RunAsSet($User, "", $Password)
;проверка верны ли введённые записи на право обладания правами админа
If IsAdmin() Then
;запуск программы
Run($what_to_run)

If @error Then
MsgBox(16, "Ошибка", "Введен неправильный пароль или отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5)
ContinueLoop
EndIf
Exit
EndIf
;закрытие окна
Case $msg = $cancel or $msg = $GUI_EVENT_CLOSE
ExitLoop
EndSelect
WEnd
EndFunc

; Возвращает массив со счетчиком - состав локальной группы "Администраторы"
Func _AdminUsers()
Local $i, $res [1] = [0]
; читаем состав группы
Local $members = _NetLocalGroupGetMembers (@ComputerName, 'Администраторы')
; проверка на ошибки
If @error Then
MsgBox (16, 'Ошибка выполнения', 'Код ошибки:' & @error)
Exit
EndIf
If $members [0] >0 Then
; фильтруем только локальные учетные записи
For $i=1 To $members [0]
If StringRegExp ($members [$i], '^' & @ComputerName & '\\') Then
ReDim $res [$res[0]+2]
$res [0] = $res [0]+1
$res [$res[0]] = StringRegExpReplace ($members [$i], '^' & @ComputerName & '\\', '')
EndIf
Next
EndIf
Return $res
EndFunc

; Возвращает массив со счетчиком- состав локальной группы произвольного компьютера
Func _NetLocalGroupGetMembers($server, $group)
Local $i, $string, $res [1] = [0], $pointer= DllStructCreate ("ptr")
; Выполняем запрос к базе SAM
Local $ret = DllCall ("netapi32.dll", "int", "NetLocalGroupGetMembers", _
"wstr", "\\" & StringRegExpReplace ($server, '^\\+', ''), _
"wstr", $group, _
"int", 3, _
"ptr", DllStructGetPtr ($pointer), _
"int", -1, _
"int_ptr", 0, _
"int_ptr", 0, _
"int_ptr", 0 )
; Если произошла ошибка, то выход с кодом ошибки
If $ret[0]>0 Then
SetError ($ret)
Exit
EndIf
; Если есть результат, то обрабатываем каждый отдельно
If $ret[6]>0 Then
Local $buffer = DllStructCreate ("ptr[" & $ret[6] & "]", DllStructGetData ($pointer,1) )
For $i=1 To $ret[6]
$ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
"int", 0, _
"int", 0, _
"ptr", DllStructGetData ($buffer, 1, $i), _
"int", -1, _
"str", "", _
"int", 0, _
"int", 0, _
"int", 0 )
$string = DllStructCreate("char[" & $ret[0] & "]")
$ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
"int", 0, _
"int", 0, _
"ptr", DllStructGetData ($buffer, 1, $i), _
"int", -1, _
"ptr", DllStructGetPtr ($string), _
"int", $ret[0], _
"int", 0, _
"int", 0 )
ReDim $res [$res[0]+2]
$res [0] = $res [0]+1
$res [$res[0]] = DllStructGetData ($string,1)
Next
EndIf
; Чистим временные системные структуры
DllCall ("netapi32.dll", "int" ,"NetApiBufferFree", _
"ptr" , DllStructGetData ($pointer,1) )
Return $res
EndFunc




© OSzone.net 2001-2012