Показать полную графическую версию : Автоматизация изменения данных авторизации на устройстве
Armsinglom
08-02-2019, 11:05
Добрый день.
Господа, подскажите пожалуйста, каким способом можно решить такую задачу:
1) Есть большая куча устройств с возможностью подключения к ним через web морду, данные устройства имеют авторизацию (login/password)(см. auth.jpg).
2) Данное устройство имеет несколько учетных записей. (admin/service/ и т.д.) (см. user.jpg)
3) Изменения пароля для всех учетных записей можно сделать только под учетной записью admin.
Задача:
Необходимо изменить стандартный пароль для нескольких учетных записей, причем на большей половине устройств пароли уже изменены и трогать их не нужно.
Как я вижу в общих чертах решение:
Подключаемся к устройству, пытаемся авторизоваться под стандартным логином и паролем, если авторизация успешна то меняем пароль для учетных записи. Так же нужно учитывать что предварительно пароли уже нагенерированы для каждого IP устройства и лежать в файлике...
Armsinglom
10-02-2019, 11:31
Попробовал это сделать так, но столкнулся с несколькими проблемами:
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
objIE.Navigate "10.37.167.114/chgpassw.htm"
While objIE.Busy
WScript.Sleep 200
Wend
Set objForm = objIE.Document.forms("frm")
objForm.elements("user_no").value = "130"
objForm.submit()
WScript.Sleep 200
objForm.elements("oldpassw").value = "password"
objForm.elements("newpassw1").value = "Password"
objForm.elements("newpassw2").value = "Password"
objIE.Visible = True
1) Не получается обойти проблему с авторизацией на устройстве. (приходится руками вводить логин и пароль)
2) Страница изменения пароля открывается, выбирается учетная запись на которой необходимо поменять логин и пароль, но поля oldpassw/newpassw1/newpassw2 не заполняются.
Так же хорошо бы что бы скрипт работал со списком IP адресов, логинов, и паролей, ну и был какой то обработчик ошибок.
Armsinglom
11-02-2019, 09:50
Ребят совсем нет идей? Так же скажу, что когда то давно это реализовывали на питоне, но теперь из за безопасной безопасности остались варианты только vbs, js, powershell. Можно с помощью этих инструментов решить задачу?
Armsinglom
11-02-2019, 10:09
Авторизацию IE удалось обойти через chrome, http://admin:password@10.37.166.114/chgpassw.htm(в IE данный способ авторизации не работает), но непонятно как через chrome работать с элементами....
Armsinglom
11-02-2019, 11:06
Решил проблему с авторизацией IE:
Создал записи в реестре DWORD с именами iexplore.exe и explorer.exe values = 0.
для текущего юзера:
HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
Если необходимо для всех юзеров то вот:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
Теперь IE понимает адрес такого формата: http://admin:password@10.37.166.114/chgpassw.htm ,авторизация теперь не выскакивает...
Осталось:
1) Научить скрипт брать логин, пароль и IP из файлика.
2) Осталась нерешенная проблема с заполнением полей oldpassw/newpassw1/newpassw2. (выбор юзера на котором будет меняться пароль выбирается корректно.)
3) обработка ошибок.
Armsinglom
11-02-2019, 15:08
Все удалось оживить скрипт, пароль на устройстве изменился!
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
objIE.Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
While objIE.Busy
WScript.Sleep 200
Wend
Set objForm = objIE.Document.forms("frm")
objForm.elements("user_no").value = "130"
objForm.submit()
WScript.Sleep 600
Set objForm = objIE.Document.forms("frm")
objForm.elements("oldpassw").value = "password"
objForm.elements("newpassw1").value = "Passwordnew"
objForm.elements("newpassw2").value = "Passwordnew"
objIE.Visible = True
Помогите заставить этот скрипт брать логин, пароль, IP из файла для заполнения данной формы
objIE.Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
и пароли для заполнения этих форм:
objForm.elements("oldpassw").value = "password"
objForm.elements("newpassw1").value = "Passwordnew"
objForm.elements("newpassw2").value = "Passwordnew"
А так же обработать ошибку, типа если не удалось подключится к IP из за того что не подошел стандартный пароль, забить на него и перейти к следующему устройству.
Armsinglom
11-02-2019, 17:03
Немного доработал скрипт, была проблема с IE, он мог не работать по какой то причине и скрипт не отрабатывал. Добавил фикцию ожидания работоспособности IE:
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
objIE.Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
While objIE.Busy
WScript.Sleep 200
Wend
Set objForm = objIE.Document.forms("frm")
objForm.elements("user_no").value = "130"
objForm.submit()
While objIE.Busy
WScript.Sleep 200
Wend
Set objForm = objIE.Document.forms("frm")
objForm.elements("oldpassw").value = "password"
objForm.elements("newpassw1").value = "Passwordnew"
objForm.elements("newpassw2").value = "Passwordnew"
objForm.submit()
objIE.Visible = True
Теперь все работает отлично.
Но осталась еще задачи которые необходимо решить:
1) Заставить скрипт работать по алгоритму:
а) Брать IP для подключения из файлика (пароль и логин стандартные admin/password)
б) Если скрипту удалось авторизоваться под стандартными паролем и логином, то изменить его. (предварительно пароли уже есть сгенерированы и лежат в файлике)
в) Если авторизация на хосте не прошла, то ничего не делать, просто продолжаем работу с остальными хостами.
2) Сделать вывод результата в файл:
а) Не получилось авторизоваться
б) Получилось авторизоваться и установить такой-то пароль.
в) Хост не доступен
а) Брать IP для подключения из файлика (пароль и логин стандартные admin/password) »
2) Сделать вывод результата в файл: »
С этим-то проблем не будет, если Вы покажете образец файла, упаковав его в архив и приложив к сообщению.
Armsinglom
11-02-2019, 21:34
Ну на самом деле файл банальный, Exel, с несколькими полями.. (см. 123.jpg). При необходимости конечно, можно и поменять....
При необходимости можно добавить поля стандартного логина и пароля:
ip id pass def_login def_pass
10.37.116.114 103 Fsasfasfs5 admin password
10.37.116.115 104 SGssfaasg4 admin password
Как правильнее я не знаю, с VBS я на ВЫ...
Вы можете упаковать банальный файл Excel в архив, каковой приложить к сообщению? Так, пришёл в личку.
И поясните, в какой файл планируется делать вывод.
Как правильнее я не знаю, с VBS я на ВЫ... »
Ну, не совсем на Вы, судя по проделанной работе.
Armsinglom
11-02-2019, 22:20
любой, но желательно csv с любым разделителем, что бы потом удобно было выгружать в exel и анализировать...
Armsinglom
12-02-2019, 22:56
а подскажите VBS с exel работает примерно по такой технологии?
Sub Get_Value_From_Close_Book_Formula()
Dim sPath As String, sFile As String, sShName As String
sPath = "C:\Documents and Settings\" '"
sFile = "Книга1.xls" '"
sShName = "Лист1" '"
Application.DisplayAlerts = 0
With Range("A1:A100")
.Formula = "='" & sPath & "[" & sFile & "]" & sShName & "'!" & "A1" '"
'"A1" - указывается начальная ячейка диапазона, из которого необходимо получить значения
.Value = .Value
End With
Application.DisplayAlerts = 1
End Sub
Ну, смотрите:
Option Explicit
'Const READYSTATE_COMPLETE = 4
'Dim objIE
Dim objRange
Dim arrRow
Dim boolIsFirstRow
Dim i
With WScript.CreateObject("Excel.Application")
With .Workbooks.Open("C:\Мои проекты\0244\ip-collector-025.xlsx")
With .Worksheets.Item(1)
If .AutoFilterMode Then
boolIsFirstRow = True
For Each objRange In .AutoFilter.Range.Rows
If boolIsFirstRow Then
boolIsFirstRow = False
arrRow = .Application.Transpose(.Application.Transpose(objRange.Value2))
WScript.Echo Join(arrRow, vbTab)
WScript.Echo "--------------------------"
Else
arrRow = .Application.Transpose(.Application.Transpose(objRange.Value2))
WScript.Echo Join(arrRow, vbTab)
'For i = LBound(arrRow) To UBound(arrRow)
' WScript.Echo arrRow(i)
'Next
End If
Next
Else
WScript.Echo "Probably no Autofilter in first worksheet in this workbook."
End If
End With
.Close
End With
.Quit
End With
'Set objIE = WScript.CreateObject("InternetExplorer.Application")
'
'With objIE
' .Visible = False
' .Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
'
' Do
' WScript.Sleep 100
' Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
'
'
' With .Document.forms("frm")
' .elements("user_no").value = "130"
'
' .submit()
' End With
'
' Do
' WScript.Sleep 100
' Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
'
' With .Document.forms("frm")
' .elements("oldpassw").value = "password"
' .elements("newpassw1").value = "Passwordnew"
' .elements("newpassw2").value = "Passwordnew"
'
' .submit()
' End With
'
' .Visible = True
'End With
'
'Set objIE = Nothing
WScript.Quit 0
Содержимое столбцов будет построчно появляться в массиве arrRow(). Что есть что на Рабочем листе — смотрите сами, мне мало о чём говорят поля site и service. Примерный облагороженный вид Вашего кода — под комментариями.
Запись в файл простая — создали (или открыли для добавления и пишете, в конце — закрываете. Например, запишем всё содержимое рабочего листа в текстовый файл:
Option Explicit
'Const READYSTATE_COMPLETE = 4
'Dim objIE
Dim objRange
Dim arrRow
Dim boolIsFirstRow
Dim i
Dim objFSO
Dim objTS
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
With WScript.CreateObject("Excel.Application")
With .Workbooks.Open("C:\Мои проекты\0244\ip-collector-025.xlsx")
With .Worksheets.Item(1)
If .AutoFilterMode Then
boolIsFirstRow = True
Set objTS = objFSO.CreateTextFile("C:\Мои проекты\0244\ip-collector-025.csv", True)
For Each objRange In .AutoFilter.Range.Rows
If boolIsFirstRow Then
boolIsFirstRow = False
arrRow = .Application.Transpose(.Application.Transpose(objRange.Value2))
WScript.Echo Join(arrRow, vbTab)
WScript.Echo "--------------------------"
objTS.WriteLine Join(arrRow, ",")
Else
arrRow = .Application.Transpose(.Application.Transpose(objRange.Value2))
WScript.Echo Join(arrRow, vbTab)
objTS.WriteLine Join(arrRow, ",")
End If
Next
objTS.Close
Set objTS = Nothing
Else
WScript.Echo "Probably no Autofilter in first worksheet in this workbook."
End If
End With
.Close
End With
.Quit
End With
'Set objIE = WScript.CreateObject("InternetExplorer.Application")
'
'With objIE
' .Visible = False
' .Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
'
' Do
' WScript.Sleep 100
' Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
'
'
' With .Document.forms("frm")
' .elements("user_no").value = "130"
'
' .submit()
' End With
'
' Do
' WScript.Sleep 100
' Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
'
' With .Document.forms("frm")
' .elements("oldpassw").value = "password"
' .elements("newpassw1").value = "Passwordnew"
' .elements("newpassw2").value = "Passwordnew"
'
' .submit()
' End With
'
' .Visible = True
'End With
'
'Set objIE = Nothing
WScript.Quit 0
Мне, правда, не очень понятно, зачем писать именно в текстовый файл, чтобы открывать его потом в Excel, вместо того, чтобы зараз писать непосредственно в Рабочую книгу Excel, коль мы так и так Excel пользуем в коде.
Armsinglom
13-02-2019, 00:14
Спасибо огромное.
Немного не понял вот эти части скрипта :
Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
и
' .elements("oldpassw").value = "password"
' .elements("newpassw1").value = "Passwordnew"
' .elements("newpassw2").value = "Passwordnew"
IP и пароли не из файла берутся??
Немного не понял вот эти части скрипта : »
Это Ваш код.
IP и пароли не из файла берутся?? »
Вы же не привели соответствия между перечисленным и полями в присланной Рабочей книге. Приведёте, что откуда брать — продолжим.
Armsinglom
13-02-2019, 00:53
Понял, сейчас постараюсь донести мои мысли :)
Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
Сюда мы должны подставить IP из присланного мной файлика. Столбец "A". http://admin:password не трогаем, это дефолтная данные авторизации.
.elements("newpassw1").value = "Passwordnew"
.elements("newpassw2").value = "Passwordnew"
Сюда подставить 2 раза пароль взятый из столбца "C"
И вывести результат в файл, даже можно и в этот файл в пустые столбцы, допустим "F;G и т.д."
т.е. задумка в чем, скрипт подключается по всем IP адресам из этого файла, пробует авторизоваться под стандартным admin/password, если ему это удается, то он меняет пароль на тот который в столбце "C". Если авторизация не успешна на каком то из IP, это нам говорит о том что там пароль не дефолтный и делать соответственно нам с ним нечего не надо, продолжаем проверять остальные строки...
столбы с названием SITEID это просто номинальный номер устройства(для быстрого поиска). Столбец с названием Serviсe нас тоже не интересует.
Пробуйте (по понятным причинам — не проверялось):
Option Explicit
Const READYSTATE_COMPLETE = 4
Dim objIE
Dim objRange
Dim arrRow
Dim boolIsFirstRow
Set objIE = Nothing
With WScript.CreateObject("Excel.Application")
With .Workbooks.Open("C:\Мои проекты\0244\ip-collector-025.xlsx")
With .Worksheets.Item(1)
If .AutoFilterMode Then
boolIsFirstRow = True
For Each objRange In .AutoFilter.Range.Rows
If boolIsFirstRow Then
boolIsFirstRow = False
Else
arrRow = .Application.Transpose(.Application.Transpose(objRange.Value2))
If objIE Is Nothing Then
Set objIE = WScript.CreateObject("InternetExplorer.Application")
End If
With objIE
.Navigate "http://admin:password@" & arrRow(0) & "/chgpassw.htm"
Do
WScript.Sleep 100
Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
With .Document.forms("frm")
.elements("user_no").value = "130"
.submit()
End With
Do
WScript.Sleep 100
Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
With .Document.forms("frm")
.elements("oldpassw").value = "password"
.elements("newpassw1").value = arrRow(2)
.elements("newpassw2").value = arrRow(2)
.submit()
End With
' А результат-то где?!
End With
End If
Next
Else
WScript.Echo "Probably no Autofilter in first worksheet in this workbook."
End If
End With
.Close
End With
.Quit
End With
If Not objIE Is Nothing Then
objIE.Quit
Set objIE = Nothing
End If
WScript.Quit 0
И вывести результат в файл, »
Какой результат? Я не вижу в Вашем коде ничего, похожего на результат.
Armsinglom
13-02-2019, 01:35
ошибка... прикрепил скрин
Давайте попробуем поменять:
.Navigate "http://admin:password@" & arrRow(1) & "/chgpassw.htm"
…
.elements("newpassw1").value = arrRow(3)
.elements("newpassw2").value = arrRow(3)
Armsinglom
13-02-2019, 01:55
Другая ошибка...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.