Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Программирование "удобняшек" на VBScript

Автор: vlth
Дата сообщения: 18.12.2009 16:45
C помощью SendKeys можно эмулировать нажатие любых клавиш. Только этот способ не даёт 100% гарантии, поскольку управляемое окно может теоретически потерять фокус.
Автор: KDSKDS
Дата сообщения: 20.12.2009 00:07
А как же мультимедийные клавиатуры всегда нажимают кнопки (и вызывают соответствующее действие), даже если медиаплеер не является активным окном?
Автор: miksanfree
Дата сообщения: 20.12.2009 01:00
KDSKDS
Дело не в фокусе. Дело в том, что в стандартном MediaPlyer-е кнопки не имеют хендлов. Поэтому конкретно какой-то кнопке послать щелчок не получится.

Есть вариант просто приблизительно послать щелчок главному окну с определенными координатами, чтобы "попасть" по нужной кнопке. Но эти координаты меняются, если растягивать и менять размеры главного окна. Это все нужно учитывать.

Есть еще вариант с сообщением WM_COMMAND, но это уже не нажатие клавиш.
Автор: vlth
Дата сообщения: 20.12.2009 01:36
KDSKDS
Я имел в виду клавиши стандартной клавиатуры. При этом, как правильно заметил miksanfree , щёлкать по конкретным кнопкам в медиаплеере не получится.
Автор: SerBUser
Дата сообщения: 21.12.2009 10:38
Есть скрипт, который добавляет пользователей в AD из Excel:

Код:
Dim objRootLDAP, objContainer, objUser, objShell
Dim objExcel, objSpread, intRow,lngFlag
Dim strUser, strOU, strSheet
Dim strCN, strSam, strFirst, strLast, strPWD
' Revision. My attributes
Dim strPDO, strEmail, strPhone, strDesc, strDispName, strTitle, strDept, strCompany, strUPN

strOU = "OU=Test, " ' Не забудьте конечную запятую
strSheet = "C:\Users.xls"

' Соединяемся с Active Directory, c указаным OU.
Set objRootLDAP = GetObject("LDAP://rootDSE")
Set objContainer = GetObject("LDAP://" & strOU & "dc=test-domain,dc=ru")

' Открываем лист Excel. Если на компьютере не установлен Excell - ОБЪЕКТ НЕ СОЗДАСТСЯ!!!
Set objExcel = CreateObject("Excel.Application")
Set objSpread = objExcel.Workbooks.Open(strSheet)
intRow = 2 'Строка 1 содержит заголовки.

' Цикл 'DO...Loop' который читает ячейки
' Помните, что значения "x" в (intRow, x) должны соответствовать столбцам в strSheet
Do Until objExcel.Cells(intRow,1).Value = ""
strSam = Trim(objExcel.Cells(intRow, 1).Value)
strCN = Trim(objExcel.Cells(intRow, 2).Value)
strDispName = Trim(objExcel.Cells(intRow, 3).Value)
' Создаем пользователя по данным из strSheet.
Set objUser = objContainer.Create("User", "cn=" & strCN)
objUser.sAMAccountName = strSam
objUser.displayName = strDispName
objUser.SetInfo
' Отдельная секция для включения аккаунта и установки пароля
objUser.userAccountControl=66048
objUser.pwdLastSet = 0
objUser.SetInfo

intRow = intRow + 1
Loop
objExcel.Quit
WScript.Quit
' Конец
Автор: niichavo
Дата сообщения: 21.12.2009 12:33
SerBUser

Цитата:
Никак не могу сделать, чтоб выставлялись две галочки - "Срок действия пароля не ограничен" и "Запретить смену пароля пользователем"

Управление свойствами UserAccountControl с использованием флагов контроля учетных записей

Цитата:
PASSWD_CANT_CHANGE
Примечание Данное разрешение невозможно назначить при помощи прямой правки атрибута UserAccountControl. Для получения сведений о назначении разрешения программным путем см. раздел «Описание флагов свойств».     0x0040    64



Добавлено:
Modifying User Cannot Change Password (WinNT Provider)
Автор: quakerock
Дата сообщения: 23.12.2009 11:57
Всем привет.
У меня есть такой скрипт:

Set Processes = GetObject("winmgmts://localhost")
Set myProcEnum = Processes.ExecQuery("select * from Win32_Process")
For Each Proc In myProcEnum
If Proc.Name = "Процесс.exe" Then
Proc.Terminate
End If
Next

Вопрос: можно ли сие творение запихать в бесконечный цикл с таймаутом, что бы допустим проходит 2 минуты и если "Процесс.exe" опять появился, то скрип его убивал и так бесконечно?
Автор: vlth
Дата сообщения: 23.12.2009 12:19
quakerock

Код: do
'Ваш код
'...
wsh.sleep 120000
loop
Автор: quakerock
Дата сообщения: 23.12.2009 13:34
vlth

Большое спасибо.
Автор: Esserg
Дата сообщения: 23.12.2009 15:46
Вопрос: как сделать скрипт который бы, по порядку:
1) экспортировал ветки реестра пользователя под которым зашли
(например (User1), Пароль 123) группа Administrator,
2) автоматически создавал второй профиль (User2) с таким же паролем но в группе Users
3) делал бы профиль User2 профилем по умолчанию (т.е. чтобы его имя было сразу написано всегда в окне логина)
4) запускал logoff из профиля user1
5) при входе в систему под user2 (пароль вводим сами) импортировал всё что было сохранено в п.1.
и копировал всё что получится (не задавая вопросов) из C:\Documents and Settings\User1\ в C:\Documents and Settings\User2\

Это нужно вот для чего: есть сеть (Novell client + win XP на компах), создаём на каждом компе новый профиль и преносим в него все настройки со старого.

Создать профиль из коммандной строки не проблема, это я могу. А вот реестр и всё остальное автоматизировать не получается.

нашел тему про копирование пользователей http://forum.ru-board.com/topic.cgi?forum=8&topic=35142

И вообще возможно ли это сделать с помощью *.vbs и батников, если да подскажите пожалуйста как.
Автор: SerBUser
Дата сообщения: 24.12.2009 08:41
Подскажите, как получить список всех organizationalUnit в домене, включая вложенные?
Автор: niichavo
Дата сообщения: 24.12.2009 10:18
SerBUser

Цитата:
Подскажите, как получить список всех organizationalUnit в домене, включая вложенные?


Код: Const ADS_SCOPE_SUBTREE = 2

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

objCommand.CommandText = _
"SELECT Name, ADsPath FROM 'LDAP://dc=твой,dc=домен'" & _
" WHERE objectCategory='organizationalUnit' ORDER BY Name"
Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst
Do Until objRecordSet.EOF
WScript.StdOut.WriteLine objRecordSet.Fields("Name").Value
objRecordSet.MoveNext
Loop
Автор: Hugo121
Дата сообщения: 26.12.2009 21:28
Подскажите, чем заменить ExeScript для компиляции vbs2exe - но чтобы корректно определял путь к скрипту, а не так, как VbsEdit...
В ExeScript вирус в windows.pe сидит, или с новыми базами сканер клинит, но результат один - не работают скомпилированные скрипты...
Или как выкрутиться? Может этот пе есть нормальный?
Автор: garri671
Дата сообщения: 11.01.2010 12:12
Доброго времени суток!
Подскажите как выгрузить в файл всех пользователей домена (логин и ФИО), работающих в данный момент. Админские полномочия есть, AD в наличии. Заранее благодарен.
Автор: JekaRus
Дата сообщения: 12.01.2010 11:32
Есть очень хороший способ получения даты в нужном формате на батнике
FOR /F "tokens=1,2,3 delims=./ " %%i IN ('date /t') DO Set mytime=%%k.%%j.%%i
Как это сделать на vbs?
Автор: Hugo121
Дата сообщения: 12.01.2010 16:32
Я такой код пользовал:

Код:
vremja = Split((Replace((Date() & "." & Time()), ":", ".")), ".")
'msgbox vremja(0) 'date
'msgbox vremja(1) 'month
'msgbox vremja(2) 'year
'msgbox vremja(3) 'hour
'msgbox vremja(4) 'min
'msgbox vremja(5) 'sec

mytime = vremja(2) & "." & vremja(1) & "." & vremja(0) & "." & vremja(3) & vremja(4) & vremja(5)

msgbox mytime
Автор: niichavo
Дата сообщения: 12.01.2010 21:15
Hugo121

Цитата:
Так про замену ExeScript никто ничего не знает?

VBS2EXE - утилита для компиляции vbs и js скриптов в exe выдранная из пакета PrimalScript
Автор: Hugo121
Дата сообщения: 13.01.2010 09:54
niichavo


Цитата:
VBS2EXE - утилита для компиляции vbs и js скриптов в exe выдранная из пакета PrimalScript

Как использовать, не подскажете коротенько?
Автор: niichavo
Дата сообщения: 13.01.2010 10:20
Hugo121

Цитата:
Как использовать, не подскажете коротенько?

Запуск без параметров выдаёт подсказку

Код:
Usage: vbs2exe -s<script> species a script file to pack
-o<outputname> specifies the name of the output file
-d<datafile> specifies a datafile to pack
-c<com object> specifies a COM object to pack
-i<iconfile> specifies an icon to use instead of the default icon.
-xc Use CScript.exe
-xw Use WScript.exe
-xh Use MSHTA.exe
-xp Use PowerShell.exe
-xs Use SAPIEN Script Host (Windows)
-xl Use SAPIEN Script Host (Command Line)
-l Leave data files
-f Use current folder instead of temp folder
-? Displays this screen
Автор: Hugo121
Дата сообщения: 13.01.2010 10:50

Цитата:
Запуск без параметров выдаёт подсказку

Вот чего никак не научился - как это окно на экране затормозить?
Так, получилось: vbs2exe -sWscriptpath.vbs -ivbs2exe.ico -xw -f
Вот только путь опять берёт не по месту файла, а из c:\WINDOWS\system32
Сам скрипт такой:


Код:
WScript.Echo wscript.path
MyPath = left (WScript.ScriptFullName, (Len(WScript.ScriptFullName))-(Len(WScript.ScriptName)))
msgbox MyPath
Автор: Leon_Ko
Дата сообщения: 13.01.2010 11:24
Hugo121

Цитата:
Вот чего никак не научился - как это окно на экране затормозить?

Использовать нормальные файловые менедженры, например - Far File Manager, а не всякие "недоокошки" . Если ты программер, конечно. Или хотя бы по роду деятельности занимаешься работой со скриптами. Разумеется, можно и командный интерпретатор (Cmd.exe) настроить, но зачем? С Far'ом - гораздо удобнее.
Есть и альтернативы, если поискать - кому что нравится.
Но по моему скромному мнению вопрос "как это окно на экране затормозить?" в подобном топике - сам по себе является злостным оффтопиком .
Сорри уж за каламбур .
Автор: Hugo121
Дата сообщения: 13.01.2010 11:35
Я командную строку из-под Тотала запускаю, но результат, как и из-под Фара...
Но ладно, не суть, оффтоп, не важно...
Автор: SerBUser
Дата сообщения: 15.01.2010 01:40
Помогите, пожалуйста - есть Эксклевский файл, в который из AD заношу данные пользователей:

Код:
Set objRootDSE = GetObject("LDAP://RootDSE")
strRoot = objRootDSE.Get("DefaultNamingContext")
strFilter = "(&(objectCategory=Person)(objectClass=User))"
strAttributes = "distinguishedName,sAMAccountName,userPrincipalName,cn,Company,givenName,sn," & _
"displayName,physicalDeliveryOfficeName," & _
"telephoneNumber,mail," & _
"department," & _
"manager"
strScope = "subtree"
Set cn = CreateObject("ADODB.Connection")
Set cmd = CreateObject("ADODB.Command")
cn.Provider = "ADsDSOObject"
cn.Open "Active Directory Provider"
cmd.ActiveConnection = cn
cmd.Properties("Page Size") = 1000
cmd.CommandText = "<LDAP://" & strRoot & ">;" & strFilter & ";" & _
strAttributes & ";" & strScope
Set rs = cmd.Execute
Worksheets("Лист1").Activate
For i = 0 To rs.Fields.Count - 1
Worksheets("Лист1").Cells(17, i + 1).Value = rs.Fields(i).Name
Worksheets("Лист1").Cells(17, i + 1).Font.Bold = True
Next
Worksheets("Лист1").Range("A18").CopyFromRecordset (rs)
rs.Close
cn.Close
Автор: velvetfox
Дата сообщения: 18.01.2010 21:52
Прошу помощи знатоков.
Ситуация:
Вот таким скриптом запускаются два батника,последовательно копирующие файл в две папки на флэшке G:\

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "D:\test\Z.bat", 0, true
WshShell.Run "D:\test\ZZ.bat", 0, true
WScript.Quit

сами батники:
Z.bat
@echo off
chcp 1251
copy "C:\Documents and Settings\Елена\Application Data\EssentialPIM\*.epim" /Y "G:\BACKUP\Application Data\"

ZZ.bat
@echo off
chcp 1251
copy "C:\Documents and Settings\Елена\Application Data\EssentialPIM\*.epim" /Y "G:\Prgport\EPIMportable\Database\"

Вопросы:
1.Как всё это объединить в один скрипт?
2.Как сделать так, чтобы копировался не один файл *.epim, а всё содержимое папки EssentialPIM (там ещё папка есть и файл конфигурации)?
3.В принципе, желательно, чтобы, если копирование действительно по факту произошло,
то выводилось сообщение "Копирование успешно", а если, например, дама забыла вставить
флэшку, выводилось сообщение "Вставьте флэшку!"
4.Самое интересное: дама теряет флэшку, покупает новую,и действует по схеме - вставил флэшку - ткнул на ярлык - вынул флэшку.
И думает, что всё ОК.
Но система новую флэшку распознаёт как F:\ а не G:\ т.е. ничего не копируется...
Возможна ли реализация такого: скрипт распознаёт флэшку (с любой буквой), при отсутствии на ней целевых папок создает их и копирует туда инфу.
Спасибо.
Автор: Hugo121
Дата сообщения: 21.01.2010 13:12
4. Я поместил бы скрипт на флешку, может прописал в авторун. Т.е. если флешка вставлена, с неё и запускаем. Можно ещё в начале кода прописать выбор, что делать - копировать на флешку или с неё.
Ну если потеряет - сперва делаем новую (с скриптом и каталогами), далее по схеме.
Автор: KDSKDS
Дата сообщения: 21.01.2010 22:05
vlth
miksanfree
Нет необходимости кликать по кнопкам непосредственно, у кнопок есть клавиатурные аналоги. Требовалось лишь получить PID MediaPlayer'а и применить к нему метод AppActivate, а потом уже просто кнопки нажимать SendKeys'ем

velvetfox
вместо copy используй xcopy с необходимыми ключами
проверяй errorlevel после копирования. 0 - всё хорошо, не 0 - что-то не так, какая-то ошибка
Автор: Hugo121
Дата сообщения: 22.01.2010 08:42
velvetfox
2. Для теста: помести что-либо в папку "C:\1\проба с пробелом".
Всё из этой папки скопируется в папку с скриптом.

Код: MyPath = left (WScript.ScriptFullName, (Len(WScript.ScriptFullName))-(Len(WScript.ScriptName))-1)
REM msgbox MyPath
REM msgbox WScript.ScriptFullName

Const OverWriteFiles = TRUE

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFolder "C:\1\проба с пробелом" , MyPath , OverWriteFiles
Автор: velvetfox
Дата сообщения: 22.01.2010 18:06
Hugo121
Спасибо и мегареспект! Вариант работает.

Автор: eheadz
Дата сообщения: 25.01.2010 21:50
Ребята, нужна помощь

Скопипастил из инета общеизвестный скрипт мониторинга папки
и пытаюсь туда добавить проверку на наличие файла.


Код:
'====начало====
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _
& "Targetinstance ISA 'Win32_SubDirectory' and " _
& "TargetInstance.GroupComponent= " _
& "'Win32_Directory.Name=""c:\\\\_scripts""'")
Do
Set objLatestEvent = colMonitoredEvents.NextEvent
strReturned = objLatestEvent.TargetInstance.PartComponent
strFoldPath = Split(strReturned, "Win32_Directory.Name=")(1)
strFoldPath = Replace(strFoldPath, """", "")
strFoldPath = Replace(strFoldPath, "\\", "\")

'====моя проверка====
If "папка НЕ содержит файл *.doc" then
Wscript.Echo "нужные файлы не найдены"
End If
'ТУТ НУЖЕН переход на Loop или начало

'====продолжение====
WshShell.Run (процедура архивации), 0, True
Loop
Автор: Hugo121
Дата сообщения: 26.01.2010 08:16
Вам надо архивировать, если есть файл? Почему тогда не так:

Код:
'====моя проверка====
If "папка НЕ содержит файл *.doc" then
Wscript.Echo "нужные файлы не найдены"
Else
WshShell.Run (процедура архивации), 0, True
End If

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475

Предыдущая тема: Работа в Delphi c CryptoApi


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.