четверг, 5 июля 2012 г.

Собственный troubleshooting pack

image

Внимание: мой новый RSS-Feed: http://feed.feedcat.net/815939

Измените свою подписку, пожалуйста. 

Как я однажды написал, можно не только сказать пользователю, какой именно ему нужно запустить troubleshooting pack, но и создать собственный. Ну и не прошло пары лет, как я созрел разобраться, как же это делается и рассказать. Я был уверен, что это близко к, как говорят наши иностранные коллеги, “rocket science”, однако я сильно заблуждался: это легко. Мало того, это достаточно интересно, поскольку для его создания нужно применить практически все из арсенала гиков:

1) Использовать GUI

2) Написать скрипты

3) Запустить то, что получилось и увидеть автоматический результат!

Так что, давайте приступим.

К сожалению, эта штука проста, но не настолько, чтобы ее можно было создать в notepad. Ну, может и есть такой метод, но он будет всяко сложнее, чем то, что я сейчас расскажу. Перво-наперво, необходимо скачать Windows 7 SDK. Я, честно говоря, не знаю, какой именно компонент ставит то, что нам нужно, потому поставил все целиком. Если кому-то критично, что ставится, всегда можно выяснить. Ну а после инсталляции, в меню найдется Troubleshooting Pack Designer:

image

Теперь остается определиться, какую проблему нам нужно решить с помощью нашего будущего чудо-инструмента. В моем случае я собираюсь автоматически решать мелкую, но доасдную проблему. Мой ноутбук Dell не всегда корректно определяет скорость сети, после того, как я помещаю его в док-станцию. Обычно помогает выключение и включение сетевого интерфейса, что, в общем-то, не сложно, но всегда же хочется потратить день на то, чтобы потом решить за пять минут задачку, не правда ли? (и да, я знаю, что просто скрипт из двух строчек был бы даже лучше, но… См. вышеWinking smile). Так что запускаем утилиту:

image

и создаем новый проект:

image

image

(обратите внимание на поле “Privacy URL”: оно обязательно к заполнению) Дальше все предельно просто. Добавляем новую корневую причину сбоя (Root cause) (а можно и несколько добавить). В моем случае это “A Network is detected 10Mbps instead of 100”:

image

и жмем “Design Troubleshooter”. Выполняем ряд настроек: Troubleshooter – включать или не включать привилегированный режим, и взаимодейстовать ли с пользователем. В моём случае ни то, ни другое не нужно:

image

Потом конфигурируем resolver, и у меня для него все так же просто:

image

Ну и разумеется, мы желаем, чтобы после исправления проблемы наш инструмент сам проверил, а правда ли проблема устранена:

image

Ну и наконец, нужно создать скрипты для этих задач

Troubleshooter:

# TroubleshooterScript - This script checks for the presence of a root cause

# Key Cmdlets:

# -- update-diagrootcause flags the status of a root cause and can be used to pass parameters

# -- get-diaginput invokes an interactions and returns the response

# -- write-diagprogress displays a progress string to the user

 

$RootCauseID = "NetIs10"

 

# Your detection Logic Here

$speed = (Get-WmiObject -Class Win32_NetworkAdapter | Where-Object { $_.Speed -ne $null -and $_.MACAddress `

-ne $null -and $_.name -like "*82567lm*"}).speed

if ($speed -ne 100000000)

      {

      $RootCauseDetected = $true

      }

      #Replace "$true" with the result of your detection logic

 

#The following line notifies Windows Troubleshooting Platform of the status of this root cause

update-diagrootcause -id $RootCauseId -detected $RootCauseDetected

Чрезвычайно примитивно, всего лишь проверяет, равна ли скорость интерфейса 100Mbps.

Resolver:

# Resolver Script - This script fixes the root cause. It only runs if the Troubleshooter detects the root cause.

# Key cmdlets:

# -- get-diaginput invokes an interactions and returns the response

# -- write-diagprogress displays a progress string to the user

 

# Your logic to fix the root cause here

$network = Get-WMIObject Win32_NetworkAdapter | where {$_.name -like "*82567lm*"}

$network.disable()

Start-Sleep 4

$network.enable()

Этот даже еще проще: просто “перезагружает” интерфейс.

Ну и теперь компилим (попутно решаем вопрос о том, каким сертификатом подписывать: тестовым самоподписанным или нормальным), пакуем и используем.

image

По крайней мере для меня это было забавным приключением с полезным выхлопом. Надеюсь и всем остальным тоже понравится.

Комментариев нет: