Тема: HTA: Управление USB-устройстами хранения информации
Приглашаю принять участие в разработке и тестировании HTML-приложения для управления USB-устройствами хранения информации.
USBMaster 2.0 beta1.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Серый форум → Общение → Windows Script Host, HTA (VBScript, JScript) → HTA: Управление USB-устройстами хранения информации
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Приглашаю принять участие в разработке и тестировании HTML-приложения для управления USB-устройствами хранения информации.
USBMaster 2.0 beta1.
objReg.EnumKey HKLM, strSys, arrSubKeys'получаем подразделы HKEY_LOCAL_MACHINE\SYSTEM
For Each subkey In arrSubKeys
Да, так действительно есть косяки при таком перечислении ключей реестра, я обошёл этот "косяк" вот так...
objReg.EnumKey HKLM, strSys, arrSubKeys'получаем подразделы HKEY_LOCAL_MACHINE\SYSTEM
For i=0 In UBound(arrSubKeys)
Так будет корректно (без пропусков и сбоев) перебирать все значения...
P/S.: Причину не знаю тоже, просто знаю как это обойти...
Так там вроде дальше проверка:
If Len(strSubkey) Then DelSubkeys objReg, HKLM, strKey & "\" & strSubkey
А то бывает пустую строку возвращает.
Или не в этом месте - файл del.lib, строка 94
Да и перед For Each проверка (тот же файл, строка 91):
If IsArray(arrSubKeys) Then
Где вылетело? Расскажите, пожалуйста, буду исправлять.
Может по коллекции кошернее от 0, а не For Each...
Проверил, у меня на XP скрипт отработал нормально. Евген, это совет? Правильнее For i = 0 To ?
Нигде не вылетело...
я и не проверял...
я по своему опыту говорю, что если используешь For Each вместе с EnumKey, то точно будут глюки в перечислении ключей, поэтому вместе с EnumKey надо использовать For var=0 to UBound(arrKeys).
Вот только в этом случае будет обеспечено правильное и полное перечисление всех ключей...
Этот глюк выявился при тестах на ~2500 компах... !!! ВОТ ЭТО СТАТИСТИКА !!!
если используешь For Each вместе с EnumKey, то точно будут глюки в перечислении ключей, поэтому вместе с EnumKey надо использовать For var=0 to UBound(arrKeys).
Спасибо Евген, принял
Статистика впечатляет. А я по-стариковски, For Each...
На самом деле меня интересует работа по сети - нет в данный момент под рукой сетки потестить:
- работает ли подключение к WMI
- копируются ли файлы по сети на админскую шару через fso - типа fso.CopyFile "\\Имя_Компа\Admin$\Имя_Файла, или надо мапить обязательно
OFF:
Этот глюк выявился при тестах на ~2500 компах... !!!
Какой глюк? Чем он вызывается, определили?
Какой глюк? Чем он вызывается, определили?
В постах выше всё описано...
В постах выше всё описано...
Где? Не вижу. Равно не вижу разницы:
Option Explicit
Const HKEY_LOCAL_MACHINE = &H80000002
Dim strComputer
Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx
Dim arrSubKeys, elem
Dim i
strComputer = "."
Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\default")
Set objSWbemObjectEx = objSWbemServicesEx.Get("StdRegProv")
WScript.Echo "=========================================="
If objSWbemObjectEx.EnumKey(HKEY_LOCAL_MACHINE, "SYSTEM", arrSubKeys) = 0 Then
For Each elem In arrSubKeys
WScript.Echo elem
Next
Else
WScript.Echo "Error for enumerating subkeys [HKEY_LOCAL_MACHINE\SYSTEM]"
End If
WScript.Echo "=========================================="
If objSWbemObjectEx.EnumKey(HKEY_LOCAL_MACHINE, "SYSTEM", arrSubKeys) = 0 Then
For i = LBound(arrSubKeys) To UBound(arrSubKeys)
WScript.Echo arrSubKeys(i)
Next
Else
WScript.Echo "Error for enumerating subkeys [HKEY_LOCAL_MACHINE\SYSTEM]"
End If
WScript.Echo "=========================================="
Set objSWbemObjectEx = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing
WScript.Quit 0
========================================== ControlSet001 ControlSet003 LastKnownGoodRecovery MountedDevices Select Setup WPA CurrentControlSet ========================================== ControlSet001 ControlSet003 LastKnownGoodRecovery MountedDevices Select Setup WPA CurrentControlSet ==========================================
Если про это:
objReg.EnumKey HKLM, keyUSB, arrSubKeysUSB
If IsArray(arrSubKeysUSB) Then
For Each subkeyUSB In arrSubKeysUSB
то ведь проверять нужно, что возвращает метод «EnumKey()».
то ведь проверять нужно, что возвращает метод «EnumKey()».
Полагаю уважаемый Евген столкнулся именно с вопросом проверки
Понравился Ваш вариант:
If objSWbemObjectEx.EnumKey(HKEY_LOCAL_MACHINE, "SYSTEM", arrSubKeys) = 0 Then
Как говорится, дешево и сердито . Читайте мануал Вкуснее, проще чем у меня. Хотя Вы проверяете как отработал метод, а не что он возвращает.
Уважаемый Dmitrii оказал помощь (на другом форуме) в вопросе работы с ACL, у него в коде обратил внимание проверка: If Not IsEmpty
Пробовал, не покатило. У меня If IsArray - вроде работает, мануал читал - массив должен метод возвращать.
Уважаемые форумчане, кто пробовал приладу, может расскажете? Интересуют все те же два вопроса:
- работает ли подключение к WMI удаленного компа
- копируются ли файлы по сети на админскую шару через fso - типа fso.CopyFile "\\Имя_Компа\Admin$\Имя_Файла, или надо мапить обязательно
- копируются ли файлы по сети на админскую шару через fso - типа fso.CopyFile "\\Имя_Компа\Admin$\Имя_Файла, или надо мапить обязательно
Данный скрипт не проверял, но вообще копироваться должно.
Полагаю уважаемый Евген столкнулся именно с вопросом проверки
Нет...
я в процессе работы столкнулся с вопросом инвентаризации установленного софта, и при использовании For Each перечисление веточек проходило не стабильно, т.е. бывало некоторые веточки почему-то пропускались, некоторые дважды попадались в перечислении... вообщем стабильности не было...
пока я не стал использовать For var=0 to Ubound(arrKeys)...
вот я с чем столкнулся...
Евген, спасибо, ясно. Сам я никогда с подобным поведением не сталкивался.
Данный скрипт не проверял, но вообще копироваться должно.
Так я понимаю, что должно, но бывают же варианты
Евген, спасибо, ясно. Сам я никогда с подобным поведением не сталкивался.
Такая же ерунда
alexii пишет:Евген, спасибо, ясно. Сам я никогда с подобным поведением не сталкивался.
Такая же ерунда
Секундочку...
вот ссылка http://da440dil.narod.ru/scripts.html
Вот цитата...
Здесь следует сделать оговорку. С рекурсивной процедурой бывают косяки: иногда objReg.EnumKey не может прочитать имя раздела - вместо имени читает пустую строку и по ходу рекурсии происходит переполнение памяти. В таком случае не спасает вариант:
wshShell.Run "reg.exe delete " & Chr(34) & "имя_раздела или имя_родительского_раздела" & Chr(34) & " /f"
Только последовательное удаление подразделов - ручками - либо через редактор реестра, либо через консоль.
Если честно - не понял почему так происходит. Смотришь через regedit - все нормуль - ключи как ключи, ничего особенного. А objReg.EnumKey не читает. Кто знает причину - пожалуйста, сообщите. Буду очень рад
А говорите что не сталкивались...
А говорите что не сталкивались...
Здесь причина в кэше. После перезагрузки такие ключи читаются и удаляются без проблем.
Евген, а Вы правы
Сегодня почему-то приложение стало неправильно считать количество флешек.
Оказалось, что на одном из циклов EnumKey выдает не массив.
Заменил For Each на For i=0 To UBound - и заработало!!! Не понимаю почему...
Не понимаю почему...
Вот и я говорю - For Each - ГЛЮЧИТ !!!
Хотел реализовать запуск от имени - не получилось.
Нарисовал такой скриптик:
Set objShellApp = CreateObject("Shell.Application")
Set wshShell = CreateObject("WScript.Shell")
objShellApp.ShellExecute "mshta.exe" , Chr(34) & wshShell.CurrentDirectory & "\" & "usbmaster.hta" & Chr(34), "", "runas",1
Set wshShell = Nothing
Set objShellApp = Nothing
Не подключается к CIMV2 - пишет ошибка 2147024891.
Думаю потому, что к локальному к WMI от имени нельзя. Жаль...
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться