Powershell авторизация на сайте: Авторизация на сайте через Powershell
Авторизация на сайте через Powershell
В качестве дополнительного интернета пользуюсь услугами PEOPLEnet (есть такой оператор 3G интернета в Украине). Для того, чтобы узнать состояние счёта нужно отправить sms на определённый номер, либо зайти в систему самообслуживания. Как первое, так и второе делать всегда лень, а за состоянием счёта следить нужно. В очередной раз пополняя счёт подумал, а нельзя-ли упростить процедуру определения состояния счёта, тем более, что ни номера, на который нужно слать sms, ни своего номера/пароля от системы самообслуживания я не помню, а браузерам хранить пароли я не доверяю. Так появилась идея написать скрипт, который сам будет заходить на сайт, коннектиться, проверять счёт, а мне будет только выводить результат.
Поискав немного в интернете понял, что я далеко не первый, кому лень вводить логины / пароли кто захотел сделать подобный скрипт.
Немного повозившись родилось решение. Попробую описать ход мыслей.
Для того, чтобы войти в систему самообслуживания нужно заполнить следующую форму:
Исследуя код страницы можно увидеть, что форма для авторизации называется LoginForm, а поля для ввода номера и пароля X_Username и X_Password соответственно.
Этого достаточно, чтобы начать писать скрипт.
Для начала вводим номер, пароль и адрес страницы:
$login = "number" $password = "password" $url = "http://my.people.net.ua"
Создаём объект InternetExplorer, загружаем страницу и ждём окончания загрузки:
$IE = New-Object -ComObject InternetExplorer.Application $IE.Navigate($url) While ($IE.Busy) { Start-Sleep -Milliseconds 100 }
Можно убедиться, что форма одна, и называется она LoginForm:
$IE.Document.forms | Select-Object name
Заполняем форму, нажимаем кнопку входа, и ждём пока загрузится:
$form = $IE.Document.forms.namedItem("LoginForm") $form.item("X_Username").value = $login $form.item("X_Password").value = $password ($form | Where-Object {$_.value -eq "Вхід"}).click() While ($IE.Busy) { Start-Sleep -Milliseconds 100 }
После того, как страница загрузится нужно только посмотреть на её содержимое. Из всей страницы, нас интересует только одна строка, которая в обычном виде выглядит следующим образом:
Как мне показалось достать эту строку из всего текста проще всего с помощью свойства innerText, содержащего весь текст страницы, и выбрав только интересующую информацию с помощью регулярного выражения:
$text = $IE.Document.documentElement.innerText # Закрываем IE $IE.Quit() # .+ - один, или несколько любых символов $regex = [regex]'Стан рахунку:.+грн.' $regex.Match($text) | Select-Object -ExpandProperty value
Результат:
Что и требовалось.
Понравилось это:
Нравится Загрузка…
Похожее
Как сделать автоматическую windows авторизацию на powershell? — Хабр Q&A
Есть некий ресурс с которого необходимо получить информацию. На ресурсе стоит Windows авторизация причем достаточно своеобразная. Еще одна «фича» данного ресурса это включение ресурса на заданный интервал времени. Для авторизации я использую следующий скрипт его недостаток заключается в том что он просто вставляет учетные данные в форму и необходимо руками подтверждать их, т.е. нажимать на кнопку «Ок»:
#Учетные данные
$user = 'login'
$pass = 'superpass'
$secureStringPwd = $pass | ConvertTo-SecureString -AsPlainText -Force
$credis = New-Object System.Management.Automation.PSCredential -ArgumentList $user, $secureStringPwd
#Куда подключаемся
$source = "https://Resource/"
#Подключаемся к ресурсу
$parce = Invoke-WebRequest -Uri $source -Credential $credis
#пошел запрос к серверу и тут от нас требуют подтверждение учетных данных
Не могу найти информацию как сделать автоматическое подключение чтобы уже нормально закинуть в шедайлер.
Рекомендовать другие инструменты бессмысленно по причине того что на комп нельзя ничего больше ставить и приходиться выкручиваться встроенными инструментами.
============================================================================
UPD > Проковырявшись 2 дня понял что проблема не в авторизации. командлет отрабатывает прекрасно. Проблема в сертификатах. Они есть в хранилище и дополнительно в скрипте стоит игнорирование проблемных сертификатов. В браузере все нормально проходит. Как и положено. Сертификат в хранилище, только авторизация. Ошибок и предупреждений в виде страницы ошибки сертификата нет. Опытным путем было получено как раз-то, что на каждый вызов сертификата ( который игнорируется) происходит попытка авторизации. Если нажимать на «отмену», то через несколько «отмен» происходит нормальная авторизация через invoke-webrequest.
Я уже начинаю ненавидить госструктуры в которых так работают сервисы.
управление серверами из браузера / Microsoft corporate blog / Habr
PowerShell – это один из основных инструментов, который может использовать системный администратор для выполнения настройки и для управления доменной сетью. Часто у системного администратора возникает необходимость удаленно подключиться к серверу и выполнить на нем определенные задачи. Конечно, можно использовать Remote Desktop, но этом случае администратор будет ограничен – не всегда можно легко и быстро удаленно подключиться к компьютеру, не всегда под рукой есть удобный компьютер. В этой статье я расскажу вам о возможности удаленного подключения с использованием PowerShell Web Access.
PowerShell позволяет с помощью специальных командлетов выполнить абсолютно все, что можно сделать в системе, используя графический интерфейс, а также то, что в графическом интерфейсе выполнить невозможно. Таким образом, PowerShell является универсальным средством управления.
Основное достоинство PowerShell Web Access заключается в том, что системный администратор может работать на сервере удаленно, используя самый обычный браузер. И предвидя возможные вопросы, под обычным браузером здесь подразумевается не только InternetExplorer, но и Safari, и Mozila Filefox, и Google Chrome.
Список поддерживаемых браузеров:
- Windows Internet Explorer для Microsoft Windows 8.0, 9.0, 10.0 и 11.0
- Mozilla Firefox 10.0.2
- Google Chrome 17.0.963.56m для Windows
- Apple Safari 5.1.2 для Windows
- Apple Safari 5.1.2 для Mac OS
Для установки и настройки PowerShell Web Access нужно выполнить три основных шага:
- Установить PowerShell Web Access
- Настроить шлюз
- Настроить правила авторизации и безопасности сайта
Далее подробное выполнение каждого из этих шагов я вам и опишу. Кстати, уже упоминалось, что в большинстве случаев настройку Windows Server можно выполнять двумя способами – с помощью графического интерфейса и с помощью командлетов PowerShell.
1 Установка PowerShell Web Access
Сам процесс установки PowerShell Web Access довольно-таки обычен. Установить этот компонент можно как с помощью Мастера установки ролей и компонентов сервера (Add Roles and Features Wizard), так и с помощью командлета PowerShell.
В Мастере установки ролей и компонентов выбираем пункт Компоненты (Features) и в нем устанавливаем дополнение для PowerShell –PowerShell Web Access. Для корректной работы PowerShell Web Access должна быть установлена роль веб-сервера (Web Server Role — IIS), которая будет автоматически выбрана для инсталляции.
Также вы всегда можете воспользоваться альтернативным решением и использовать для установки не графический интерфейс, а командлет PowerShell (только не забудьте запустить PowerShell с правами Администратора):
Install-WindowsFeature –Name WindowsPowerShellWebAccess -ComputerName <computer_name> -IncludeManagementTools –Restart
Тем не менее, установка – это только первый шаг в настройке работы PowerShell Web Access.
2 Настройка шлюза
Настраивать шлюз необходимо на том сервере, на который была установлена роль PowerShell Web Access.
Для настройки PowerShell Web Access, можно использовать командлет Install—PswaWebApplication. С помощью него вы установите веб приложения PowerShell Web Access на ваш сайт, созданный по умолчанию при установке IIS сервера. Путь по умолчанию к сайту выглядит следующим образом: https://<имя_сервера>/pswa. Для изменения этого значения вы можете использовать параметр WebApplicationName (если хотите изменить имя веб приложения – pswa) и WebSiteName (если хотите установить веб приложения на другой сайт). Также, для обеспечения безопасности вашей среды, необходимо использовать действительный сертификат, который подписан вашей службой Certification Authority. О том, как настроить SSL-сертификат в диспетчере служб IIS можно прочитать здесь.
3 Настройка правил авторизации и безопасности сайта
После того, как вы установили PowerShell Web Access и настроили шлюз (установили веб приложение), ваши пользователи смогут открыть страницу входа в браузере, но не смогут выполнить вход. Причина в том, что пока мы не предоставили доступ нашим пользователям в явном виде. Важно отметить, что при проверке подлинности при авторизации в PowerShell Web Access доступ по умолчанию ограничен, а не разрешен. Т.е. если разрешение пользователю явно не выдано, то доступа к чему-либо у этого пользователя нет.
Добавить правила авторизации можно только с помощью командлетов PowerShell, графический интерфейс для этого не предусмотрен. Для добавления правила авторизации мы используем командлет Add-PswaAuthorizationRule с различными параметрами, позволяющими указать имя пользователя, имя компьютера и т.д. (подробнее про командлеты для PowerShell Web Access здесь):
Теперь пользователь может из браузера подключиться к PowerShell Web Access и начать работу. Причем подключиться вы можете к любому из серверов, если имеете соответствующее разрешение.
Сеанс PowerShell Web Access представляет собой командную строку PowerShell, с помощью которой вы можете удаленно управлять задачами на вашем сервере.
Еще одной интересной возможностью, предлагаемой PowerShell Web Access, является возможность сохранения сеансов и переподключения к ним с различных устройств (нажмите кнопку «Save»). По умолчанию PowerShell Web Access ограничивает пользователя тремя одновременными сеансами.
Время ожидания сеансов PowerShell Web Access не вечно. Сообщение об истечении времени ожидания отображается для вошедшего пользователя через 15 минут отсутствия активности в сеансе. Если пользователь не отвечает в течение пяти минут после вывода сообщения об истечении времени ожидания, сеанс заканчивается, и пользователь выходит из системы. Значения по умолчанию для PowerShell Web Access можно изменить в параметрах веб-сайта в диспетчере служб IIS.
Отмечу, что так как PowerShell Web Access – это веб-консоль PowerShell для конкретного удаленного компьютера, то вы можете использовать только те командлеты или сценарии PowerShell, которые на этом удаленном компьютере доступны.
Чем отличается веб-консоль от локальной PowerShell? Большая часть базового функционала доступна, но отличия есть:
- При сообщении информации о ходе выполнения какой-либо задачи на экране отображается только конечный результат выполнения командлета (этапы выполнения не показываются)
- Фоновый и основной цвета изменить в веб-консоли нельзя
- PowerShell Web Access в своем интерфейсе не реализует ряд методов, например, любые команды, осуществляющие запись в консоль Windows
- PowerShell Web Access не поддерживает некоторые сочетания клавиш, во многих случаях потому, что эти клавиши зарезервированы для команд браузера
Кроме того, используя PowerShell Web Access вы попадаете под ряд ограничений:
- Двойное подключение — попытка подключиться ко второму удаленному компьютеру из существующего подключения
- PowerShell Web Access использует и имеет те же ограничения, что и удаленный сеанс Windows PowerShell
- Заполнение нажатием клавиши TAB не действует в сеансах, сконфигурированных для работы в ограниченном пространстве выполнения или в режиме NoLanguage, также не может быть запущена команда exit для завершения сеанса (для выхода нужно будет нажать соответствующую кнопку на странице консоли)
- PowerShell Web Access допускает только одно подключение к удаленному компьютеру в рамках одного сеанса браузера; нельзя выполнить один вход и подключиться к нескольким удаленным компьютерам, используя отдельные вкладки браузера
- При бездействии сеанса шлюза PowerShell Web Access удаленное подключение между шлюзом и конечным компьютером закрывается. При этом прекращается выполнение всех командлетов или сценариев. Поэтому для выполнения длительных задач рекомендуется использовать PowerShell.
Надеюсь, что вы нашли в этой статье полезную для себя информацию, которую сможете применить в вашей работе.
Спасибо за внимание!
Полезные ссылки
Invoke-WebRequest: Обработка содержимого веб-страниц и HTML сайтов в Powershell
В PowerShell версии 3.0 появилась возможность напрямую обращаться и работать с HTML веб-страницам в Интернете. Для этого был разработан специальный командлет Invoke-WebRequest. Данный командлет позволяет реализовать множество сценариев: начиная от возможности скачать/ загрузить файл с/на любого веб-сайта по HTTP/ HTTPS/ FTP, заканчивая возможностями парсинга HTML страниц, мониторинга состояния веб серверов, заполнения и отправкой веб-форм. В целом, новый командлет предоставляет все необходимые методы для навигации по DOM дереву HTML документа. В этой статье мы разберём базовые примеры работы с командлетом PowerShell Invoke-WebRequest.
Совет. Командлет Invoke-WebRequest доступен в Windows PowerShell 3.0, поэтому перед началом работы убедитесь, что у вас используется эта или более свежая версия. Если на компьютере установлено несколько версий Posh, переключиться между ними можно так.
Использование командлета Invoke-WebRequest
Командлет Invoke-WebRequest (псевдоним wget) может отправлять и получать HTTP, HTTPS и FTP запросы, обрабатывать возвращаемый сервером ответ. Полученный ответ представляет собой набор коллекции форм, ссылок, изображений и других важных элементов HTML документа.
Попробуем выполнить следующую команду:
Invoke-WebRequest -Uri "http://winitpro.ru"
Как вы видите, возвращенный ответ представляет собой не простой HTML код страницы. Вы видите различные свойства web-документа. Командлет Invoke-WebRequest, как и большинство других командлетов PowerShell оперирует объектами. Invoke-WebRequest возвращает объект типа HtmlWebResponseObject. Посмотрим все свойства данного объекта:
$WebResponseObj = Invoke-WebRequest -Uri "http://winitpro.ru"
$WebResponseObj| Get-Member
Чтобы получить сырой HTML код веб страницы, который содержится в данном объекте, выполните:
$WebResponseObj.content
Вы можете вернуть HTML код вместе с HTTP заголовками, которые вернул веб сервер:
$WebResponseObj.rawcontent
Вы можете проверить только код ответа веб-сервера и HTTP заголовки HTML страницы:
$WebResponseObj.Headers
Как вы видите, веб сервер вернул ответ 200, т.е. запрос выполнен успешно и веб сервер доступен и работает корректно.
Получаем список всех HTML ссылок на странице
Обратимся к главной странице нашего сайта и получим список ссылок, имеющихся на ней:$SiteAdress = "http://winitpro.ru"
$HttpContent = Invoke-WebRequest -URI $SiteAdress
$HttpContent.Links | Foreach {$_.href }
Чтобы получить и сам текст ссылки (содержится в элементе InnerText), можно воспользоваться такой конструкцией:
$HttpContent.Links | fl innerText, href
Можно выбрать только ссылки с определенным CSS классом:
$HttpContent.Links | Where-Object {$_.class -eq "page-numbers"} | fl innerText, href
Или определенным текстом в url:
$HttpContent.Links | Where-Object {$_.href -like "*exchange*"} | fl innerText,href
Парсинг HTML страниц с помощью Powershell
Командлет Invoke-WebRequest позволяет довольно быстро и удобно парсить содержимое любых веб-страниц. При обработке HTML страницы из ее содержимого формируются коллекции ссылок (links), веб-форм (forms), изображений (images), скриптов (scripts) и т.д.
С помощью Powershell получим содержимое главной страницы нашего сайта:
$Img = Invoke-WebRequest "https://winitpro.ru/"
Затем выведем список всех изображений на данной странице:
$Img.Images
Сформируем коллекцию из полных url путей к используемым изображениям:
$images = $Img.Images | select src
Инициализируем новый экземпляр класса WebClient:
$wc = New-Object System.Net.WebClient
И скачаем все изображения со страницы (с оригинальными именами) в каталог c:\tools\:
$images | foreach { $wc.DownloadFile( $_.src, ("c:\tools\"+[io.path]::GetFileName($_.src) ) ) }
В качестве интересного примера использования командлета Invoke-WebRequest можно привести способ узнать внешнего IP адреса компьютера из PowerShell.
Как скачать файл по HTTP с помощью PowerShell
Invoke-WebRequest может работать как аналог Wget или cURL для Windows, позволяя скачать с веб-страницы или ftp сайта нужный файл или файлы. Допустим, нам нужно с помощью PowerShell скачать по HTTP некий файл (в нашем примере дистрибутив Mozilla Firefox). Выполним такую команду:
Invoke-WebRequest "https://download.mozilla.org/?product=firefox-32.0.3-SSL&os=win&lang=ru" -outfile “c:\tools\firefox setup 32.0.3.exe”
В результате выполнения командлета с указанного URL адреса будет скачан файл и сохранен в каталоге c:\tools\ под именем firefox setup 32.0.3.exe. Если нужно скачать файл с FTP сайта, просто замените http: // на ftp: //.
Таким образом вы с легкостью можете на определенной веб-странице найти все ссылки, попадающие под конкретные критерии (класс ссылки, разрешение в имени файла, url адрес), и скачать файлы по полученным ссылкам. Например, имеется некий сайт с кучей ссылок на PDF документы. Ваша задача скачать все эти файлы на ваш компьютер. Костяк PowerShell скрипта для массовой скачки файлов может выглядеть так:
$OutDir="C:\Downloads\docs\PDF"
$SiteAdress = "https://www.site.ru/free-pdf-books/"
$HttpContent = Invoke-WebRequest -URI $SiteAdress
$HttpContent.Links | Where-Object {$_.href -like "*.pdf"} | %{Invoke-WebRequest -Uri $_.href -OutFile ($OutDir + $(Get-Random 100000)+".pdf")}
В результате выполнения скрипта в целевом каталоге будут загружены все pdf файлы со страницы. Каждый файл сохраняется под произвольным именем.
В PowerShell 6.1 команделт Invoke-WebRequest поддерживает режим докачки. Таким образом с помощью параметра Invoke-WebRequest -Uri $Uri -OutFile $OutFile –Resume вы можете возобновить загрузку файла в случае падения канала или сервера.
Заполнение и отправка веб-форм на Powershell
Многие веб-сервисы для работы требуют ввода различных данных в HTML формы. С помощью Invoke-WebRequest можно получить доступ к любой HTML-форме, заполнить необходимые поля и передать заполненную форму обратно на сервер. В этом примере мы покажем, как с помощью Powershell авторизоваться в почтовом ящике популярного российского сервиса mail.ru через его стандартную веб форму.
С помощью следующей конструкции сохраним информацию о куках (Cookies) подключения в отдельной сессионной переменной:
$mailru = Invoke-WebRequest https://e.mail.ru/login -SessionVariable session
Следующей командой отобразим список заполняемых полей в HTML форме авторизации (форма называется LoginExternal):
$mailru.Forms["LoginExternal"].Fields
Присвоим нужные значения всем полям:
$mailru.Forms["LoginExternal"].Fields["Login"] = "[email protected]"
$mailru.Forms["LoginExternal"].Fields["Password"] = "Str0NgP$$w0rd"
И т.д….
Чтобы передать заполненную форму на веб сервер, вызовем атрибут HTML-формы action.
$Log = Invoke-WebRequest -method POST -URI ("https://e.mail.ru/login" + $mailru.Forms["LoginExternal"].Action) -Body $mailru.Forms["LoginExternal"].Fields -WebSession $session
Недостатки командлета Invoke-WebRequest
Одним из существенных недостатком командлета Invoke-WebRequest является довольно низкая скорость работы. При загрузке файла HTTP поток целиком буферизируется в память, и только после окончания полной загрузки сохраняется на диск. Таким образом, при закачке больших файлов можно столкнутся с нехваткой памяти.
Другая проблема – командлет Invoke-WebRequest тесно связан с Internet Explorer. Например, в редакциях Windows Server Core, в которых IE не установлен, командлет Invoke-WebRequest использовать нельзя.
Если на HTTP сайте используется самоподписанный сертификат, то командлет Invoke-WebRequest отказывается получать данные с него. Чтобы игнорировать некорректный SSL сертификат, используйте следующий код:
Игнорировать SSL сертификат можно так:add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
$result = Invoke-WebRequest -Uri "https://site.ru"
Как войти на сайт с базовой аутентификацией с помощью Powershell
Вопрос:
Я пытаюсь использовать PowerShell для входа на сайт и загрузки файла.
Однако я не могу заставить PS правильно передать учетные данные.
Вот мой PS:
$webclient = new-object System.Net.WebClient
$webclient.Credentials = new-object System.Net.NetworkCredential("username","password","domain")
$webpage = $webclient.DownloadString("url goes here")
Вот окно регистрации, которое я получаю, когда попадаю на сайт в IE:
Лучший ответ:
Вот что я должен работать. Я считаю, что ключевой частью является «Basic» в CredentialCache
$webclient = new-object System.Net.WebClient
$credCache = new-object System.Net.CredentialCache
$creds = new-object System.Net.NetworkCredential("un","pw")
$credCache.Add("url", "Basic", $creds)
$webclient.Credentials = $credCache
$webpage = $webclient.DownloadString("url")
Ответ №1
Если вы хотите использовать Invoke-WebRequest
вместо WebClient
:
$securepassword = ConvertTo-SecureString "password" -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential("username", $securepassword)
Invoke-WebRequest -Uri "url goes here" -Credential $credentials
Я основал код эту статью в блоге Дугласа Тарра. Обратите внимание, что в статье имя пользователя и пароль сбиты с толку, но я исправил их в своем примере.
Ответ №2
По какой-то причине я не смог заставить любое из этих решений работать (используя PowerShell 5 на Win 10). Возможно, это была очевидная, безумная ситуация, поскольку я часто не использую PS. Но FWIW это то, как я смог заставить его работать, вручную настроив заголовок авторизации.
$url = "{url here}"
$username = "{username here}"
$password = "{password here}"
$b = [System.Text.Encoding]::UTF8.GetBytes($username + ":" + $password)
$p = [System.Convert]::ToBase64String($b)
$creds = "Basic " + $p
Invoke-WebRequest -Uri $url -Headers @{"Authorization"=$creds}
По какой-то причине другие ответы здесь делали запросы, но заголовок авторизации не отправлялся.
Ответ №3
Вот как я это сделал,
сначала создан файл download.ps1, содержащий файл powershell script,
Затем запустите этот script через пакетный файл:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File C:\Users\SS\Desktop\download.ps1
это PowerShell script:
$Username = 'Domain\user'
$Password = 'pass'
$Url = "http://google.com/target/filename.zip"
$Path = "C:\path\to\downloaded\file\filename.zip"
$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.Networkcredential($Username, $Password)
$WebClient.DownloadFile( $url, $path )
Ответ №4
Что вы должны работать (попробуйте код с некоторыми другими сайтами). Как правило, неверное имя пользователя/пароль приведет к сбою кода с ошибкой 401 (а не окном входа в систему Windows). Проблема может быть связана с веб-сайтом, требующим Интегрированная проверка подлинности Windows
PowerShell. Парсинг сайта или забрать значение с сайта. — Клёвый код
Иногда при выполнении скрипта приходится опираться на значения с web сайтов. В PowerShell с версии 3.0 для этого имеется замечательный командлет Invoke-WebRequest.
Рассмотрим подробнее скрипт:
!!!В строчке $trash = $li.innerhtml -match " \ ( ( . * ? ) \ ) "
убрать пробелы внутри ковычек » \ ( ( . * ? ) \ ) «.!!!
$ie = Invoke-WebRequest -Uri ‘http://coolcode.ru’ -Method POST -ContentType «text/plain; charset=utf-8″
$li=$ie.AllElements |where {($_.tagName -eq «LI») -and ($_.innerhtml -like «*Администрирование*»)}
$trash = $li.innerhtml -match » \ ( (.*?) \ ) «
$Matches[1]
| $ie = Invoke-WebRequest -Uri ‘http://coolcode.ru’ -Method POST -ContentType «text/plain; charset=utf-8» $li=$ie.AllElements |where {($_.tagName -eq «LI») -and ($_.innerhtml -like «*Администрирование*»)} $trash = $li.innerhtml -match » \ ( (.*?) \ ) « $Matches[1] |
Этот скрипт выполняет следующие действие: на сайте «http://coolcode.ru» мы находим рубрику «Администрирование» и смотрим сколько в данной рубрике статей.
В начале мы создаём объект, со страницей сайта:
$ie = Invoke-WebRequest -Uri ‘http://coolcode.ru’ -Method Get -ContentType «text/plain; charset=utf-8»
| $ie = Invoke-WebRequest -Uri ‘http://coolcode.ru’ -Method Get -ContentType «text/plain; charset=utf-8» |
Здесь используется самая главный командлет Invoke-WebRequest
В данном примере мы используем только необходимые параметры:
-Uri <String>
Командлет Invoke-WebRequest поддерживает следущие протоколы: HTTP, HTTPS, FTP, и FILE. В данном параметре необходимо указать url к странице, в нашем случае это http://coolcode.ru’.
-Method <WebRequestMethod>
Определяет метод используемый для веб-запроса. Допустимые значения: Default, Delete, Get, Head, Merge, Options, Patch, Post, Put и Trace.
Пробежимся в крации по ним:
Head Получение заголовка, без тела. В основном используется для получения матаданных.
Get Применяется для получения содержимого указанного ресурса.
Options Применяется для определения возможностей веб-сервера или параметров соединения.
Post Используется для передачи данных на сервер.
Put Загрузка содержимого на указанный uri.
Patch Тоже самое, что и Put но только применяется на фрагмент ресурса
Delete Удаляет указанный ресурс.
Тrace Возвращает полученный запрос, с информацией о добавлении и изменении запроса промежуточными серверами.
Merge …
В своём примере я использую значение POST. Хоть мне надо всего лишь получить данные из тела страницы и в первой редакции этой статьи я использовал метод GET, но с методом GET как то через раз отрабатывал параметр -contentType.
-ContentType <String>
Задаёт тип содержимого в веб-запросе. по умолчанию «application/x-www-form-urlencoded». Я использую данный метод, для получения данных в правильной кодировке :-ContentType «text/plain; charset=utf-8». У меня почему то этот параметр через раз работал с «-Method GET», после изменения на «-Method POST» всё работает корректно.
У командлета Invoke-WebRequest существуют так же ещё много интересных параметров, которые могут быть вам интересны:
-Body<Object>
Данный параметр задаёт тело запроса, и используется для заполнения полей на сайте. (этот параметр рассмотрим в другой статье)
-Certificate<X509Certificate>
Задаёт сертификат, для реализации безопасности в веб-запросе. Что бы найти сертификат воспользуйтесь командлетом Get-PfxCertificate или используйте Get-ChieldItem на диске Cert:. Если сертификат не действительный или не имеет достаточных полномочий, команда не выполнится.
-CertificateThumbprint<String>
Задаёт учётную запись пользователя, который имеет право на отправку запроса на цифровой сертификат открытого ключа (X509).
-Credential<PSCredential>
Задаёт учётную запись пользователя, который имеет разрешение на отправку запроса. По умолчанию используется текущий пользователь.
-DisableKeepAlive
Устанавливает значение постоянного HTTP соединения в HTTP-заголовке в значение False. По умолчанию постоянное HTTP соединение включено.
-Headers<IDictionary>
Устанавливает заголовок веб-запроса. Можно указать хэш-таблицу или словарь.
-InFile<String>
Получение содержимого веб-запроса из файла.
Определяет, сколько раз Windows PowerShell может совершить попыток для соединение с заданным URI, прежде чем возникнет ошибка подключения. По умолчанию значение 5. Значение 0 блокирует все попытки.
-OutFile<String>
Сохраняет тело ответа в указанный файл.
-PassThru
Возвращает результаты в консоль, в дополнении к записи результатов в файл. Используется вместе с параметром -OutFile
-Proxy<Uri>
Задаёт прокси сервер для выполнения запроса.
-ProxyCredential<PSCredential>
Параметры учётной записи для прокси. Например «User01» или «Domain01\User01».
-ProxyUseDefaultCredentials
Для соединением с прокси использовать учётные данные текущего пользователя.
-SessionVariable<String>
Создаёт сеанс веб-запроса в и сохраняет его в значение указанной переменной. Переменную необходимо вводить без знака доллара «$». При указании переменной сеанса, Invoke-WebRequest создаёт объект сеанса веб-запроса и присваивает его переменной с указанным именем. Вы сможете использовать данную переменную, как только закончится выполнение запроса. Данный объект не является постоянным соединением. Он содержит информацию о связи запроса, кукисы, учётные данные, максимальные значения количества соединений и строки агента пользователя. Этот объект можно использовать для обмена состояниями данных, между веб-запросами.
-TimeoutSec<Int32>
Данный параметр задаёт время, в течении которого запрос может находится в ожидании. Время указывается в секундах. Значение по умолчанию 0, что укзывает на неопределённый тайм-аут(сколько угодно долгий).
-TransferEncoding<String>
Определяет значение зжатия для заголовка HTTP. Допустимы значения Chunked, Compress, Deflate, GZip и Identity.
-UseBasicParsing
Использование объекта ответа для HTML без синтаксического анализа DOM.
-UseDefaultCredentials
Использование учётных данных текущего пользователя, для отправки веб-запроса.
-UserAgent<String>
Использовать строку для аутентификации сайтом агента. По умолчанию используется «Mozilla/5.0 (Windows NT; Windows NT 6.1; en-US) WindowsPowerShell/3.0».
-WebSession<WebRequestSession>
Назначает сеанс веб-запроса. Переменная указывается со знаком доллора($).
Что бы изменить значение параметров в сеансе веб, используйте параметры командлета, например UserAgent или Credential. Параметры командлета имеют больший приоритет, чем значчения в сессии веб-запроса.
В полученной переменной будет содержаться информация о
После исполнения команды
$ie = Invoke-WebRequest -Uri ‘http://coolcode.ru’ -Method Get -ContentType «text/plain; charset=utf-8»
| $ie = Invoke-WebRequest -Uri ‘http://coolcode.ru’ -Method Get -ContentType «text/plain; charset=utf-8» |
У будет объект, содержащий данные страницы http://coolcode.ru, но это не просто текст, а как и всё в PowerShell это объект. И у него есть очень интересные свойства:
PS C:\Windows\system32> $ie|Get-Member
TypeName: Microsoft.PowerShell.Commands.HtmlWebResponseObject
Name MemberType Definition
—- ———- ———-
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
AllElements Property Microsoft.PowerShell.Commands.WebCmdletElementCollection AllElements {get;}
BaseResponse Property System.Net.WebResponse BaseResponse {get;set;}
Content Property string Content {get;}
Forms Property Microsoft.PowerShell.Commands.FormObjectCollection Forms {get;}
Headers Property System.Collections.Generic.Dictionary[string,string] Headers {get;}
Images Property Microsoft.PowerShell.Commands.WebCmdletElementCollection Images {get;}
InputFields Property Microsoft.PowerShell.Commands.WebCmdletElementCollection InputFields {get;}
Links Property Microsoft.PowerShell.Commands.WebCmdletElementCollection Links {get;}
ParsedHtml Property mshtml.IHTMLDocument2 ParsedHtml {get;}
RawContent Property string RawContent {get;}
RawContentLength Property long RawContentLength {get;}
RawContentStream Property System.IO.MemoryStream RawContentStream {get;}
Scripts Property Microsoft.PowerShell.Commands.WebCmdletElementCollection Scripts {get;}
StatusCode Property int StatusCode {get;}
StatusDescription Property string StatusDescription {get;}
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
| PS C:\Windows\system32> $ie|Get-Member
TypeName: Microsoft.PowerShell.Commands.HtmlWebResponseObject
Name MemberType Definition —- ———- ———- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() AllElements Property Microsoft.PowerShell.Commands.WebCmdletElementCollection AllElements {get;} BaseResponse Property System.Net.WebResponse BaseResponse {get;set;} Content Property string Content {get;} Forms Property Microsoft.PowerShell.Commands.FormObjectCollection Forms {get;} Headers Property System.Collections.Generic.Dictionary[string,string] Headers {get;} Images Property Microsoft.PowerShell.Commands.WebCmdletElementCollection Images {get;} InputFields Property Microsoft.PowerShell.Commands.WebCmdletElementCollection InputFields {get;} Links Property Microsoft.PowerShell.Commands.WebCmdletElementCollection Links {get;} ParsedHtml Property mshtml.IHTMLDocument2 ParsedHtml {get;} RawContent Property string RawContent {get;} RawContentLength Property long RawContentLength {get;} RawContentStream Property System.IO.MemoryStream RawContentStream {get;} Scripts Property Microsoft.PowerShell.Commands.WebCmdletElementCollection Scripts {get;} StatusCode Property int StatusCode {get;} StatusDescription Property string StatusDescription {get;} |
Рассмотрим их:
AllElements — Возвращает массив свойств всех элементов.
Forms — Возвращает массив свойств всех форм.
Images — Возвращает массив всех свойств изображений.
InputFields — Возвращает массив всех свойств полей воода.
Links — Возвращает массив свойств ссылок.
ParsedHtml — Возвращает странцу ввиде дерева объектов.
Scripts — Возвращает массив свойств всех скриптов.
Content — Возвращает содержимое страницы.
И переходим к следующей строчке скрипта:
$li=$ie.AllElements |where {($_.tagName -eq «LI») -and ($_.innerhtml -like «*Администрирование*»)}
| $li=$ie.AllElements |where {($_.tagName -eq «LI») -and ($_.innerhtml -like «*Администрирование*»)} |
В моём случае я использую свойство AllElements объекта $ie . И у меня получится массив элементов страницы … каждый элемент будет являтся объектов со следующими свойствами:
$ie.AllElements |Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
—- ———- ———-
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
innerHTML NoteProperty innerHTML=null
innerText NoteProperty innerText=null
outerHTML NoteProperty outerHTML=null
outerText NoteProperty outerText=null
tagName NoteProperty System.String tagName=!
| $ie.AllElements |Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition —- ———- ———- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() innerHTML NoteProperty innerHTML=null innerText NoteProperty innerText=null outerHTML NoteProperty outerHTML=null outerText NoteProperty outerText=null tagName NoteProperty System.String tagName=! |
Рассмотрим его свойства:
tagName — имя элемента (div,li,p,a…)
innerHTML — HTML код внутри тэга.
innerText — Отображаемый код из тега.
outerHTML — Код всего тэга.
outerText — текс который отображается из этого тэга.
В нашем примере я использую свойства tagName и innerHTML которые должны равнятся соответствующим значениям:
where {($_.tagName -eq «LI») -and ($_.innerhtml -like «*Администрирование*»)}
| where {($_.tagName -eq «LI») -and ($_.innerhtml -like «*Администрирование*»)} |
как я узнал каким значениям должны ровняться данные параметры?
Я посмотрел код страницы. В Chrome и Firefox например, можно выделить интересующий вас участок и нажав правую кнопку выбрать в выпадающем списке кнопку звучащую примерно, как «Просмотреть код».
Но вернёмся к скрипту. После отработки строчки:
$li=$ie.AllElements |where {($_.tagName -eq «LI») -and ($_.innerhtml -like «*Администрирование*»)}
| $li=$ie.AllElements |where {($_.tagName -eq «LI») -and ($_.innerhtml -like «*Администрирование*»)} |
в переменной $li у нас будет содержаться код тэга li с кодом внутри содержащим слово «Администрирование».
Теперь из него осталось достать нужную нам информацию… а конкретно значение в скобках. Я предлагаю воспользоваться регулярным выражением:
!!!В строчке $trash = $li.innerhtml -match " \ ( ( . * ? ) \ ) "
убрать пробелы внутри ковычек » \ ( ( . * ? ) \ ) «.!!!
$trash = $li.innerhtml -match » \ ( ( . * ? ) \ ) «
$Matches[1]
| $trash = $li.innerhtml -match » \ ( ( . * ? ) \ ) « $Matches[1] |
Нужное нам значение получено.
Как легко начать писать на PowerShell или несложная автоматизация для управления Active Directory
Изучить основы PowerShell
Данная статья представляет собой текстовую версию урока из нашего бесплатного видеокурса PowerShell и Основы Active Directory (для получения полного доступа используйте секретное слово «blog»).
Данный видеокурс оказался необычайно популярным по всему миру и он проведет вас по всем ступеням для создания полного набора инструментов по управлению службой каталогов Active Directory начиная с самых азов.
Кодирование с помощью PowerShell
Вначале это может показаться сложной задачей начать работать с PowerShell, особенно если с годами вы уже привыкли работать с командной строкой cmd.exe и так называемыми «батниками» (файли с расширениями .bat и .cmd). В этой статье, написанной по материалам 2-го урока нашего видеокурса, мы расскажем, как и почему вам стоит обновить свои навыки работы с PowerShell, а также разберем основы запуска редактора PowerShell, освоим авто-завершение команд и как в любой затруднительной ситуации получить актуальную помощь и примеры.
Выполнение Команд
Консоль PowerShell – это интерактивная среда, которая позволяет запускать различные команды в реальном времени. Здесь не нужно сперва редактировать скрипт в блокноте и лишь затем запускать его в командной строке, что также значительно съэкономит ваше время.
Если вы сейчас работаете в какой-либо организации, которая при этом существует не один день, то у вас уже наверняка есть несколько маленьких скриптов на каждый день, которые вы запускаете из командной строки cmd.exe. И это отличная новость! Значит вы так же легко сможете выполнять все это и из PowerShell. Это было поистине мудрое дизайнерское решение со стороны Microsoft, так они сделали переход на новое решение более легким для администораторов.
По внешнему виду, редактор PowerShell выглядит и функционирует точно также, как и окружение командной строки cmd.exe. Приемы и навыки, которыми вы уже владеете, будут работать без изменений и в PowerShell. А если вы к тому же хотите повысить свою квалификацию и работаете над переходом от выполнения одноразовых задач, к тому чтобы обеспечивать более автоматизированное администрирование, то привычка запускать PowerShell, а не командную строку является отличным способом для начала.
Все ваши часто используемые утилиты, такие как ping, ipconfig, nslookup, и т. п. будут работать именно так, как вы ожидаете.
Как найти команды PowerShell
Люди любят PowerShell, потому что это так, ну, мощно! Но эта сила исходит от совершенно безумного количества встроенных возможностей. Это просто не возможно, да наверное и не практично, чтобы кто-то запомнил всевозможные команды, командлеты, флаги, фильтры и другие способы сказать PowerShell что и как сделать.
К счастью, прямо в редакторе встроено несколько инструментов, чтобы помочь вам справиться с этим.
Авто-завершение команд по нажатию Tab
Нет необходимости запоминать различные команды или точное написание команды. Наберите
get-c
Теперь нажимая на клавишу Tab – вы сможете перебрать все доступные команды, начинающиеся с тех символов, что вы уже ввели. Причем это работает в любой части тела команды, на которую вы пытаетесь сослаться: в именах и флагах команд и даже при автозавершении полных путей на файловой системе.
Команда Get-Command
Несмотря на то, что автодополнение по Tab работает превосходно, что произойдет, если Вы не знаете правильное имя команды, которая вам нужна? В этом случае можно использовать команду чтобы найти другие доступные команды: Get-Command.
В поиске имени команды, важно иметь в виду, что есть синтаксис для них: Глагол-Существительное. Как правило, Глаголы такие как – Get (Получить), Set (Установить), Add (Добавить), Clear (Очистить), Read (Читать) и Write (Писать) и Существительные – файлы, серверы или другими сущности в вашей сети и приложениях.
Get-Command – это инструмент для поиска и изучения команд, доступных на вашем компьютере.
Синтаксис команд в PowerShell
Кто-то когда-то описал язык скриптов Perl, как “шум из исполняемых строк кода” (ориг. “executable line noise”) – невероятно полезный инструмент, с дико непрозрачным синтаксисом и соответственно с высоким порогом входа для его изучения.
Хотя если разобраться то и традиционная командная строка в Windows не так уж далеко от этого ушла. Рассмотрим общую задачу как найти все файлы в каталоге, имена которых начинаются с ‘foo’.
CMD: FOR /D /R %G IN (“Foo*”) DO @ECHO %G
FOR и DO указывают на то, что это цикл.
Флаг /D указывает, что это цикл по всем папкам
Флаг /R указывает, что нужно включать все файлы и папки, включая подкаталоги
Шаблон поиска, который определяет интересующий нас набор файлов, обозначается с помощью “IN”
ECHO указывает, что сценарий должен вывести на экран результат каждого цикла и, наконец,
%G – это “вынужденный параметр” и выбран потому, что ранее программисты Microsoft уже использовали при разработке буквы A, D, F, N, P, S, T, и X. Поэтому, начинать с G, является хорошим тоном, т.к. это дает вам самый большой набор неиспользованных букв для форматов путей возвращенных переменных (G, H, I, J, K, L, M) – другими словами, это лайфхак.
Сравните теперь эквивалент на PowerShell:
PowerShell: Get-ChildItem -Path C:\ -Filter ‘Foo*’
Результат – тот же, но даже на таком достаточно тривиальном примере, будет намного легче понять, что происходит. Сразу становится очевидно, что делает каждый элемент в команде и как можно их изменить. Ну разве что подстановочный знак ‘*’ используемый в обоих примерах, но я думаю что вы и так прекрасно знаете, что он означает – что все элементы должны начинаться с ‘Foo’ и в конце еще что-нибудь.
Чувствуете как ваше настроение постепенно улучшается? А теперь, что если вы захотите узнать, как выбрать только файлы (а не папки) в пути? Вы можете покопаться в мануалах, или ваш лучший друг Google вам в помощь или может попытаться разобраться из командной строки? Маленькая подсказка: если вы находитесь в PowerShell, введите “-” и нажмите клавишу Tab, пройдитесь по нужным флагам, пока очевидное решение не появится.
Одна Длинная Строка против Объекта
Сайты никому не нужны, если они не в онлайне. Именно поэтому люди тратят огромное количество времени, притворяясь, что они операторы сонара на подводной лодке и «пингуют» доступность своих серверов (да-да, именно поэтому он так называется).
Несмотря на то что вывод команды Ping полезен (и вы можете использовать ping с тем же успехом и в консоли PowerShell), в конце концов это просто большая и длинная строка – ряд букв и цифр с некоторыми перерывами между ними.
В PowerShell есть команда, которая похожа на Ping, но возвращает данные в структурированном виде. Это команда Test-Connection.
Ниже приведен результат работы этой команды по обмену пакетами с сервером ‘DC’ в совершенно ином полностью структурированном виде:
Не говоря уже о том, что это намного легче читать, но главное то, что теперь вы можете передать эту информацию на вход в другую команду, придать ей еще большую полезность (наш полный видеокурс для этого и предназначен) или просто настроить ее так, чтобы в ней появилось больше смысла.
Встроенная помощь
До этого момента мы были сосредоточены на выполнении определенных команд, используя дополнение по Tab, но как только вы начнете работать с PowerShell все больше и больше команды становятся все более сложными c еще более сложными параметрами. В то время как синтаксис Глагол-Существительное (Verb-Noun) помогает, но еще больше помогает наличие под рукой:
1. Актуальной документации
2. Обилие примеров
Помочь по Командлетам
На практике, следует комбинировать команду Get-Command (чтобы найти то, что следует использовать), а затем использовать Get-Help чтобы узнать, как пользоваться этой конкретной командой.
Практический пример, как это сделать: допустим, вам нужно определить, все запущенные службы Windows на компьютере.
Для начала можно поискать команды для взаимодействия со службами:
Get-Command service
Которая сообщит вам сразу, что вы на правильном пути. Обдумывая вернуться в стандартный синтаксис команд PowerShell Глагол-Существительное, вы бы хотели выяснить, как правильно использовать команду ‘Get-Service’.
Документация Microsoft по команде Get-Service
Для этого стоит использовать команду ‘Get-Help’. Начните печатать
“Get-Help -” и затем нажмите клавишу Tab
Вы быстро обнаружите доступные опции, наиболее явно подходит один “Name”, так что стоит попробовать:
Get-Help -Name Get-Service
Тут же вы получите полный синтаксис команды (и что из опций вы можете включить или исключить на базе фильтров).
Если вы захотите исследовать команду глубже и детализировать ее вплоть до каждого параметра, то наберите:
Get-Help -Name Get-Service - Parameter Name
Помощь с примерами на PowerShell
Все мы люди и, без обид бот Google, у нас всех имеются свои психологические препоны, которые нам надо предодолеть при изучении чего-то незнакомого и привести это к понятной нам форме для того, чтобы выполнить то, что нам нужно.
Введя “-examples” или добавив флаг “-detail” к команде “Get-Help”, вам будет предоставлен набор примеров для использования команды.
Вот, к примеру, вывод для команды:
Get-Help -Name Get-Service -Examples
Оставаясь в курсе
Что может быть более ужасным, чем неработающий пример, или пример с ошибкой в документации. Часто это бывает либо из-за устаревшей документации, либо из-за неверных примеров или же из-за обновленных библиотек.
Чтобы обойти эти проблемы и заодно получить новые примеры и исправления введите:
update-help
и начнется процесс загрузки обновленной контекстной помощи.