Live Messenger

Хочу написать о такой программе как Live Messenger. Наверняка многие про него слышали, но репутация у него в России не очень, не сложилось 🙂 

У нас он куда менее популярен чем ICQ, и собственно уже этого достаточно чтобы им не пользоватся. Особо хорошим интерфейсом он тоже не отличается (хотя последняя версия и стала более менее стильно выглядеть.) Но у него есть свои плюсы, и главный из них — это возможность создания сессий Remote Assistance — Удаленный помощник. Это соединение основанное на протоколе RDP (отсюда классная скорость и нетребовательность к ширине канала (до определенной степени разумеется :))). Но в отличии от Remote Desktop этот вариант куда более удобен для удаленной поддержки. Собственно скриншот:

Создается подключение в режиме «Только просмотр», далее помощник может запросить возможность управления и если человек на противоположенном конце разрешит — будет передано и управление. При этом компьютер будет управлятся одновременно 2мя людьми, и оба смогут видеть все действия. При необходимости управляемый может в любой момент нажать клавишу Esc на клавиатуре, и управление будет прервано. Ну из дополнительных возможностей — встроен чат, есть возможность передачи файлов, и голосового общения. Мне больше нечего желать для удаленной поддержки 🙂

Теперь о том как это всё настроить и запустить. Ненамного сложнее ICQ (а чаще даже проще :)).
1. Скачиваем и устанавливаем программу.
2. Если у вас вдруг нет ни Live ID, ни .Net Passport (вы уверены?! у вас действительно нет .net passport?! Напоминаю — это таже система что используется для авторизации на любых сайтах Майкрософта, регистрации для скачивания бета версий, триалов, да и многих утилит, и т.д. и т.п….) то лучше не ходить туда где предлагает зарегистрироватся мессенджер (он предлагает LiveID), а сходить на http://www.passport.net и зарегистрировать там паспорт на любой ваш e-mail адрес — будет удобнее чем создавать новый на хотмейле. Процедура занимает 5 минут если сильно тормозить 🙂
3. Для включения собственно возможности подключения удаленного помошника необходимо правой кнопкой щелкнуть на «Мой компьютер», «Свойства», там выбрать закладку «Удаленный доступ» и поставить верхнуюю галку.
4. Для того чтобы добавить контакт, жмем кнопку добавление контакта (офигеть! :)) Это такой зеленый человечек с плюсиком 🙂 Вводим e-mail, жмем ок 🙂
5. После того как другой человек авторизирует вас, вы сможете просмотреть дополнительную информацию о нём, или сразу запросить/предложить удаленную помощь — Правый клик на контакте, «Начать действие» и выбрать соответствующее действие.

Вобщем всё достаточно просто, и на каждом шагу даются подробные инструкции.

Со мной в мессенджере можно связаться указав мой паспорт-адрес: xaegr собака яндекс точка ру 😉

Опубликовано в Uncategorized. Комментарии к записи Live Messenger отключены

PowerShell, SQL и WSUS

Сегодня переписал свой скрипт для извлечения обновлений из кеша WSUS в нормальный вид. Теперь подключение к SQL происходит непосредственно через .Net без всяких утилит. Ну и вообще расчесал чтоб было попонятнее непосвященным 🙂
Разжевывать устройство скрипта не буду, при желании разобраться можно, но если что-то непонятно — спрашивайте.
getwsus.ps1

Использование…

Итак… Запускаем файл getwsus.ps1 в контексте текущего шелла, он добавит функцию Get-WSUS

PS D:\PowerShell> . getwsus.ps1

Так как скорость работы скрипта не велика (я не нашел как в базе WSUS определяется закачано ли обновление, и приходится каждый путь проверять с помощью Test-Path) мы сразу загрузим результат выполнения в переменную $updates и работать будем уже с нею. Так как я работаю удаленно, я указываю имя сервера и сетевой путь к папке кэша обновлений. Если скрипт выполняется локально — делать этого ненужно — будет подставлен сервер Localhost, а путь к обновлениям взят из базы.

PS D:\PowerShell> $Updates = Get-WSUS -ServerName myServer -CacheLocation "\\myServer\f$\WSUS\WsusContent\"

Процесс не быстрый (во всяком случае по сети) у меня он занимает около 5 минут.

Сверим количество полученных записей с количеством реально находящихся в папке .exe файлов:

PS D:\PowerShell> $updates.Count
380
PS D:\PowerShell> (dir "\\myServer\f$\WSUS\WsusContent" -Recurse -Include *.exe).count
380

Скрипт отработал правильно 🙂 Что же мы вообще получили?

PS D:\PowerShell> $updates

Name                                           Path                                           Modified
----                                           ----                                           --------
Windows2000-KB823559-x86-ENU.exe               \\myServer\f$\WSUS\WsusContent\6D\8AF191C04C2... 01.07.2003 10:47:22
msjavwu.exe                                    \\myServer\f$\WSUS\WsusContent\57\A47BFCDDD91... 27.05.2004 20:48:22
Windows-KB870669-x86-ENU.exe                   \\myServer\f$\WSUS\WsusContent\96\E3BAB5AB395... 02.07.2004 9:39:50
WSS2003SP1-KB841876-FullFile-ENG-(SFXCAB).exe  \\myServer\f$\WSUS\WsusContent\B4\A7E23A4AA5B... 04.08.2004 13:33:37
WindowsXP-KB842773-v2-x86-enu.exe              \\myServer\f$\WSUS\WsusContent\B3\1D3D2BC417B... 10.08.2004 13:54:33
...

С путём всё нормально, он просто не поместился при выводе на консоль — у неё ограниченная ширина 🙂 Но на самом деле это обьекты, ничего не потерялось, так что ничего страшного — путь мы сейчас вернём, секономив место за счёт даты изменения:

PS D:\PowerShell> $updates[0..20] | Format-Table name,path -AutoSize

Name                                          Path
----                                          ----
Windows2000-KB823559-x86-ENU.exe              \\myServer\f$\WSUS\WsusContent\6D\8AF191C04C299392C8D905C6A2DEF310D4CDEF6D.exe
msjavwu.exe                                   \\myServer\f$\WSUS\WsusContent\57\A47BFCDDD919D509C45B3BF0355AB98107AA0157.exe
Windows-KB870669-x86-ENU.exe                  \\myServer\f$\WSUS\WsusContent\96\E3BAB5AB3953B33DD4FD28B64C6F670AAC446996.exe
WSS2003SP1-KB841876-FullFile-ENG-(SFXCAB).exe \\myServer\f$\WSUS\WsusContent\B4\A7E23A4AA5B5D0430D275C53B571E04365CE5EB4.exe
WindowsXP-KB842773-v2-x86-enu.exe             \\myServer\f$\WSUS\WsusContent\B3\1D3D2BC417BF9D881206ED238AD6A4A9C189CFB3.exe
...

Но это просто вывод на экран, нам нужно не совсем это. Создадим папку для экспорта обновлений:

PS D:\PowerShell> cd f:
PS F:\> md localrep



    Directory: Microsoft.PowerShell.Core\FileSystem::F:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        25.12.2006     16:03            localrep

PS F:\> cd localrep

Теперь выберем обновления в названии которых встречается «WindowsXP», скопируем в эту папку, создадим update.cmd в который добавим имена всех файлов с ключами для тихой установки. Ну и по ходу дела выводя названия обновлений на экран, что бы было видно что скрипт что то делает (использовать Write-Progress тут меня заломало 🙂 Можно посмотреть на него в самом скрипте — это та самая синяя штука показывающая сколько обновлений обработано :))

PS F:\localrep> $updates | where {$_ -match "WindowsXP"} | 
foreach { copy -path $_.path -destination $_.name; write-host $_.name; $_.name+" /z /u /n"} | Set-Content update.cmd

WindowsXP-KB842773-v2-x86-enu.exe
WindowsXP-KB885884-x86-ENU.exe
WindowsXP-KB885523-x86-enu.exe
WindowsXP-KB873339-x86-ENU.exe
WindowsXP-KB886185-x86-enu.exe
...

На самом деле это одна строка, я сократил чтобы не разъезжалась лента.

Посмотрим…

PS F:\localrep> ls


    Directory: Microsoft.PowerShell.Core\FileSystem::F:\localrep

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        21.09.2006      4:15     821584 IE6.0sp1-KB925486-WindowsXP-x86-ENU.exe
-a---        25.12.2006     16:18       4614 update.cmd
-a---        08.12.2005     20:47     568048 WindowsXP-KB835409-x86-ENU.exe
-a---        25.08.2004      3:50     652008 WindowsXP-KB842773-v2-x86-enu.exe
-a---        08.02.2005      0:43    1776872 WindowsXP-KB873333-x86-enu.exe
...

Получилось 🙂

Ну и напоследок можно сделать всё за одну команду 🙂

Если у кого нибудь будет возможность, засеките пожалуйста время выполнения скрипта локально на компьютере с WSUS и по сети. Сделать это можно с помощью Measure-Command, например так:

PS F:\localrep> Measure-Command { $updates = Get-WSUS "myServer" "\\myServer\f$\WSUS\WsusContent\" }

Days              : 0
Hours             : 0
Minutes           : 4
Seconds           : 34
Milliseconds      : 728
Ticks             : 2747285139
TotalDays         : 0,00317972817013889
TotalHours        : 0,0763134760833333
TotalMinutes      : 4,578808565
TotalSeconds      : 274,7285139
TotalMilliseconds : 274728,5139
Опубликовано в PowerShell. 3 комментария »

PowerShell на русском языке

Отличная новость для тех кому технический английский не родной язык 🙂 — Появился локализованный PowerShell Documentation Pack, и в списке языков есть русский! 🙂 (Хоть тут нас не считают за отсталую страну :)) Теперь незнание английского уже не катит за отмазу от чтения Getting Started и User Guide 🙂 Короче читайте, — отличные доки.

И перевод статьи от Scripting Guys, — на тему введения в PowerShell. Рекомендую почитать, еще и манера написания улыбающая 🙂 Вот только переводчики зачем-то обозвали скриптеров программистами 🙂

Опубликовано в PowerShell. 1 Comment »

Rapidshare бесятся от жадности :)


Я конечно всё понимаю, но от этого офигел 🙂 На буковки на заднем плане обратил внимание секунд через 5 только. Сначала подумал что это они таким извращенным образом меня на*уй решили послать за то что я у них что то порываюсь скачать, а ни явы ни флеша не поставил 🙂

От ведь до чего жадность людёв доводит! (с) 😉

Опубликовано в Uncategorized. Комментарии к записи Rapidshare бесятся от жадности :) отключены

Работа с текстовым выводом

Несмотря на огромное количество новых возможностей PowerShell'а, обьектный подход, и т.д., он всё равно прекрасно работает со старыми утилитами командной строки. Можно прекрасно использовать его вместо cmd.exe.

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

Есть у меня одна очень хорошая утилитка whosip.exe, делающая запрос whois по имени или ипу хоста и возвращающая результат в виде текстовых строк, где имя параметра отделено от его значения двоеточием:

PS L:\PowerShell> whosip.exe ya.ru

WHOIS Source: RIPE NCC
IP Address:   213.180.204.8
Country:      Russian Federation
Network Name: YANDEX-204-0
Owner Name:   Yandex corporate network
From IP:      213.180.204.0
To IP:        213.180.204.31
Allocated:    Yes
Contact Name: Yandex LLC Network Operations
Address:      Yandex LLC, 40A Vavilova st., 117333, Moscow, Russia
Email:        noc@yandex.net
Abuse Email:  abuse@yandex.ru
Phone:        +7 495 9743555
Fax:          +7 495 9743565

Очень похоже на вывод Format-List? 😉 Похоже, но не то. Была бы это PoSH'евская утилитка то можно было бы легко сделать много полезных вещей. Например посмотреть страны ip адресов взятых из списка:

PS L:\PowerShell> Get-Content iplist.txt | ForEach {
>>  Get-Whois $_ } | Format-Table ipaddress, country, email -AutoSize
>>

IPAddress     Country            Email
---------     -------            -----
72.14.207.99  USA - California   arin-contact@google.com
213.180.204.8 Russian Federation noc@yandex.net
81.19.66.46   Russian Federation denis@rambler-co.ru

Вот только это текстовая утилита, и чтоб получить такой результат придётся порядочно повозиться. Или нет?

Сейчас мы попробуем создать функцию-обёртку для этой команды.
Для начала создадим «пустой объект», который будем выдавать в качестве результата, потом мы наделим его нужными свойствами:

$result = New-Object PSObject

Вывод всех обычных текстовых консольных команд PowerShell превращает в массив строк, и в таком виде выводит (Визуально результат не отличается от привычного, но добавляет массу преимуществ :)). Так что мы можем отфильтровать строки с помощью Where-Object:

whosip ya.ru | Where { $_ -match "(.+?): *(.+)"}

Тут я применил регулярное выражение, которое во первых отбирает лишь строки нужного нам формата (параметр, двоеточие, значение), и во вторых помещает название параметра и значение в специальный массив $matches, с индексами 1 и 2 соответственно. Для наглядности возьмем одну строчку:

PS L:\PowerShell> "IP Address:   213.180.204.8" -match "(.+?): *(.+)"
True

Выражение истинно. В массив $matches были помещены соответствующие значения:

PS L:\PowerShell> $matches

Name                           Value
----                           -----
2                              213.180.204.8
1                              IP Address
0                              IP Address:   213.180.204.8

Под индексом 0 находится вся совпавшая строка. (Регулярные выражения (RegExp) могут показатся очень сложными для понимания, но они стоят того. Независимо от языка где они используются они позволяют секономить кучу времени при операциях со строками)

Продолжим… У нас теперь есть имя параметра и его значение, осталось прикрутить их к $result 🙂

$result | Add-Member -MemberType noteProperty -Name ($matches[1] -replace " ") -Value $matches[2]

Эта хитрая команда прицепит к $result свойство с именем из $matches[1], и значением из $matches[2]. Оператор -replace тут нужен для того чтобы убрать из названий параметров все пробелы, работать будет и с ними, но тогда параметры с пробелами придётся всегда заключать в кавычки, а это неудобно.

Ну и собственно всё. Осталось записать итоговую функцию, и закинуть её в профиль 🙂

function Get-Whois ($ip)
{
$result = New-Object PSObject
whosip $ip | where { $_ -match "(.+?): *(.+)" } |
foreach { $result | Add-Member noteProperty ($matches[1] -replace " ") $matches[2]}
$result
}

Как обычно, можно просто скопировать отсюда в консоль.

Всё, функция из начала поста работает 🙂 И не только она… 😉
Любимый Get-Member 😉

PS L:\PowerShell> Get-Whois ya.ru | Get-Member


   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       System.Boolean Equals(Object obj)
GetHashCode Method       System.Int32 GetHashCode()
GetType     Method       System.Type GetType()
ToString    Method       System.String ToString()
AbuseEmail  NoteProperty System.String AbuseEmail=abuse@yandex.ru
Address     NoteProperty System.String Address=Yandex LLC, 40A Vavilova st., 117333, Moscow, Russia
Allocated   NoteProperty System.String Allocated=Yes
ContactName NoteProperty System.String ContactName=Yandex LLC Network Operations
...

Format-List…

PS L:\PowerShell> Get-Whois ya.ru | Format-List

WHOISSource : RIPE NCC
IPAddress   : 213.180.204.8
Country     : Russian Federation
NetworkName : YANDEX-204-0
...

Похоже на оригинал? 😉

Да, кстати, можно засунуть результат в переменную:

$ya = Get-Whois ya.ru

И набрав например $ya.a[tab] наслаждаться автодополнением свойств 🙂

Опубликовано в PowerShell. 5 комментариев »