Powershell for Windows

Ноябрь 30, 2011

Сентябрь 9, 2011

Speed Install 2.0 − репозиторий под Windows

Filed under: Utilits — Метки: , , — Yamshikov Pavel @ 2:27 пп

Я до вчерашнего дня не знал, что такое репозиторий. А оказалось, что
очень полезная вещь. Это такая программа, которая помогает устанавливать
другие программы. Подобные вещи есть на Маках, на Линуксах, на
Андроиде. А на самой распространенной ОС во вселенной Windows не было. И
вот она появилась.
Преимущества репозитория:

  • в нужной категории есть список програм с описанием, выбираешь сразу ту, что нужна,
  • устанавливается последняя версия, опубликованная на официальном сайте,
  • Программа устанавливается сама, не требуется выставлять «Я согласен с условиями» и прочее.

Итак, это программа Speed Install 2.0. Она создается российскими разработчиками, издается на двух языках: русский и английский.

Удобный интерфейс

Все делается легко и просто, программа все делает за вас. Так что
можносчитать, что интерфейс Спид Инстал выполняет свою задачу на все
сто. Не надо думать − просто выбираешь программу и нажимаешь
«Установить». К хорошему быстро привыкаешь.

Поиск по категориям

Я храню у себя на диске некоторые программы. И иногда не могу найти
нужную по папкам. Ребятам, кажется, удалось создать именно такой
каталог, по которому все легко найти:

Дополнительные плюшки

Если какие-то программы нужно просто постоянно обновлять до последней
версии − это можно делать автоматически. Просто собираете программы в
список, и назначаете этот список обновляемым в автоматическом режиме.

Еще понравилась функция, которая после установки удаляет икнки с
рабочего стола. Я люблю чистый рабочий стол, мне эта функция нкжна по
зарез.

Вот официальное описание с официального сайта:

  • Сотни программ в БД.
  • Полностью автоматическая тихая установка.
  • Постоянно обновляющаяся база приложений.
  • Установка последних версий программ.
  • Мультиязычный интерфейс.
  • 32/64 битные установки.
  • Создание оффлайн установщика.
  • Создание, редактирование своих списков программ.
  • Быстрый поиск.
  • Дружественный интерфейс.
  • Все программы скачиваются только с официальных сайтов (вирусов нет).
  • HTML/XML отчеты.
  • Контроль создания ярлыков во время установки.
  • Создание исполняемых файлов с программами.
  • Контроль зависимостей (.Net, Java, etc).

Подтверждаю про постоянные обновления. Пока я писал эту статью версия обновилась до 2.0.1.1533.

Что запланировано

  • Удаленная установка на компьютеры в сети.
  • Возможность добавлять свой софт (качается по расписанию и устанавливается).
  • Список установленных программ.
  • Список программ для обновления (updater).
  • Рейтинговый центр (возможность поставить оценки программам).
  • Деинсталятор программ.
  • База программ будет расти.

Что бы я добавил:

Дизайн интерфейса на мой взгляд несколько отстает от тенденций
дизайна. Надеюсь, это улучшится. Хотя, дизайн хорош тогда, когда все
понятно. И в этом плане дизайн меня полностью устраивает.

Пожалуй я был бы рад, если кроме короткого описания в программе было
бы и описание подробное. Можно было бы еще добавить отзывы,
положительные и отрицательные, которые могут добавить зарегистрированные
пользователи.

http://vadimgalkin.pp.ru/useful/speed_install/

Август 9, 2011

FSRM 2008 R2 – Error ID: 12306 Source: SRMSVC!!!

При настройке «Email Notification» на очередном серваке столкнулся с проблемой, при нажатии «Send Test E-mail» вывалилось окно с ошибкой.

Полез смотреть «Application event log», а там вот так:

Решение проблемы помогли найти коллеги net_andy и blic дав ссылку на форм, где подобное явление уже обсуждалось.

Решение проблемы простое. В редакторе реестра открываем ветку «HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa» и создаем параметр «DWORD» с именем «LmCompatibilityLevel» и значением «2″.

Июль 15, 2011

Многопоточный сканер сети от Xaegr

Filed under: PowerShell — Метки: , , , — Yamshikov Pavel @ 9:26 дп

ThreadPing.ps1

Param (
[string[]]$Address = $(1..20 | %{"192.168.1.$_"}),
[int]$Threads = 5
)            

write-host "Distributing addresses around jobs"
$JobAddresses = @{}
$CurJob = 0
$CurAddress = 0
while ($CurAddress -lt $Address.count)
{
    $JobAddresses[$CurJob] += @($Address[$CurAddress])
    $CurAddress++
    if ($CurJob -eq $Threads -1)
    {
        $CurJob = 0
    }
    else
    {
        $CurJob++
    }
}            

$Jobs = @()
foreach ($n in 0 .. ($Threads-1))
{
    Write-host "Starting job $n, for addresses $($JobAddresses[$n])"
    $Jobs += Start-Job -ArgumentList $JobAddresses[$n] -ScriptBlock {
        $ping = new-object System.Net.NetworkInformation.Ping
        Foreach ($Ip in $Args)
        {
            trap {
                new-object psobject -Property {
                    Status = "Error: $_"
                    Address = $Ip
                    RoundtripTime = 0
                }
                Continue
            }
            $ping.send($Ip,100) | select `                 @{name="Status"; expression={$_.Status.ToString()}},
                @{name = "Address"; expression={$Ip}}, RoundtripTime
        }
    }
}            

write-host "Waiting for jobs"
$ReceivedJobs = 0
while ($ReceivedJobs -le $Jobs.Count)
{
    foreach ($CompletedJob in ($Jobs | where {$_.State -eq "Completed"}))
    {
        Receive-Job $CompletedJob | select status, address, roundtriptime
        $ReceivedJobs ++
        sleep 1
    }
}            

Remove-Job $Jobs
write-host "Done." 
Оригинал

Июнь 21, 2011

Парсинг журнала безопасности терминал-сервера. Успех входа, Отказ входа в систему.

Filed under: PowerShell, Security, Windows — Метки: , , , , , , , , , — Yamshikov Pavel @ 1:02 пп

Для получения списка событий журнала security нам понадобится командлет Get-EventLog.

image

Команда отображает содержимое всего журнала, что в корне нас не устраивает. Но все не так плохо, то что мы видим на скриншоте, не просто текст, а объекты с свойствами. Получить свойства данных объектов позволяет комадлет Get-Member. Выполнив в командной строке Get-EventLog security | Get-Member, мы получим в результате список свойств всех объектов выводимых Get-EventLog.

image

Зная список свойств, можно манипулировать результатами работы Get-EventLog. Например, что бы получить список всех событий за сегодняшний день, самым простым способом будет использование параметра -after. Полный список параметров командлета Get-EventLog можно узнать используя командлет Get-Help или здесь. В результате у нас получится команда Get-EventLog security -after (Get-date -hour 0 -minute 0 -second 0), где командлет Get-Date выдает текущую дату и время, но параметры hour, minute и second задают вывод времени с начала текущего дня. В результате мы получим список событий произошедших за сегодня.
Нам необходимо получить список всех пользователей совершавших вход на сервер по протоколу RPD, для этого используем значения EventID и EntryType.

Значения EventID

  • 528 — Успешный вход пользователя на компьютер.
  • 529 — Отказ входа в систему. Не правильное имя пользователя или пароль.

Значения EntryType

  • 10 — RemoteInteractive. Пользователь выполнил удаленный вход на этот компьютер, используя Terminal Services или Remote Desktop.

От фильтруем события из дополнив команду новыми вводными:
Get-EventLog security -message "*Тип входа:?10*" -after (Get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 528}

Параметр -message отражает полностью сообщение нашего события, в котором содержится «Entry type» («Тип входа»), через шаблоны мы задаем поиск интересующей нас строки. Далее передаем ч\з конвейер командлету Where-Object (?) для фильтрации сообщений «Успешного входа пользователя в систему». Для фильтрации сообщений «Отказа входа в систему"{$_.eventid -eq 528} заменить на {$_.eventid -eq 529}.

Результатом выполнения будет следующее:

image

Пойдем дальше, создадим файл-срипт»test.ps1″.

# В переменную "$Events" загружаем массив событий "Удаленного успешного входа в систему"
$Events = Get-EventLog security -message "*Тип входа:?10*" -after (get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 528 }

# Создаем переменную «$Data» с параметрами Время, Имя пользователя, IP адрес.
$Data = New-Object System.Management.Automation.PSObject
$Data | Add-Member NoteProperty Time ($null)
$Data | Add-Member NoteProperty UserName ($null)
$Data | Add-Member NoteProperty Address ($null)

# Пройдемся по каждому объекту из массива «$Events".
$Events | %{

# Наполняем переменную «$Data» данными.
$Data.time = $_.TimeGenerated

# В переменную «$message» загружаем массив строк, которые разделяются символом переноса строки (‘n).
# Функции trimstart(), trimend() убирают все лишние символы в конце и в начале строки.
# Функция split разделяет строку.
$message = $_.message.split(«`n») | %{$_.trimstart()} | %{$_.trimend()}

# В массиве «$message» мы ищем совпадения по строке «Пользователь:» и «Адрес сети источника:»
$Data.UserName = ($message | ?{$_ -like «Пользователь:*»} | %{$_ -replace «^.+:.»} )
$Data.Address = ($message | ?{$_ -like «Адрес сети источника:*»} | %{$_ -replace «^.+:.»})

# Вывод результата.
$Data
}

Запускаем скрипт ".\test.ps1«.
image

Если скрипт не запустился, то скорее всего ваш PoSh не настроен на выполнение скриптов. Выполните команду Set-ExecutionPolicy RemoteSignet .

Выглядит вполне хорошо, но думаю можно улучшить скрипт. Для удобства внесем в него возможность задания параметров, и выделения строк цветом по маске IP адреса.

param ($key1,$val1,$val2,$val3,$val4,$val5,$val6)

if ($val1 -eq $null) {$val1=0};

$mydate = Get-date -hour 0 -minute 0 -second 0;

if ($key1 -eq «year») { $mydate = (Get-date -hour 0 -minute 0 -second 0 -day 1 -month 1); $mydate = $mydate.addyears(-$val1); };

if ($key1 -eq «month») { $mydate = (Get-date -hour 0 -minute 0 -second 0 -day 1); $mydate = $mydate.addmonths(-$val1); };

if ($key1 -eq «day») { $mydate = $mydate.adddays(-$val1) };

if ($key1 -eq «date») { $mydate = (Get-date -hour 0 -minute 0 -second 0 -day $val1 -month $val2 -year $val3); };

# здесь реализуем возможность задания интервала

if ($val4 -eq $null) {$Events = Get-EventLog security -message «*Тип входа:?10*» -after ($mydate) | ?{$_.eventid -eq 528 }}
if ($val4 -ne $null) {$Events = Get-EventLog security -message «*Тип входа:?10*» -after ($mydate) -before (get-date -hour 0 -minute 0 -second 0 -day $val4 -month $val5 -year $val6) | ?{$_.eventid -eq 528 }}
$Data = New-Object System.Management.Automation.PSObject
$Data | Add-Member NoteProperty Time ($null)
$Data | Add-Member NoteProperty UserName ($null)
$Data | Add-Member NoteProperty Address ($null)

$Events | %{

$Data.time = $_.TimeGenerated

$message = $_.message.split(«`n») | %{$_.trimstart()} | %{$_.trimend()}

$Data.UserName = ($message | ?{$_ -like «Пользователь:*»} | %{$_ -replace «^.+:.»} )
$Data.Address = ($message | ?{$_ -like «Адрес сети источника:*»} | %{$_ -replace «^.+:.»})

$textcolor = $host.ui.rawui.foregroundcolor

$host.ui.rawui.foregroundcolor = «red»

if ($data.address -like «192.168.0*») {$host.ui.rawui.foregroundcolor = «DarkGreen»}
if ($data.address -like «10.*») {$host.ui.rawui.foregroundcolor = «yellow»}

$data

$host.ui.rawui.foregroundcolor = $textcolor

}

param ($key1,$val1,$val2,$val3,$val4,$val5,$val6) — определяет параметры, передаваемые скрипту.

if ($key1 -eq "day") {$mydate = $mydate.adddays(-$val1)}; проверяем переданные параметры на соответствие ключу, если ключ совпадает, то корректируем дату согласно задаваемым параметрам. В данном случае в качестве параметра передается ключ «day» аргументом которого мы будем переводить дату на определенное количество дней назад. Т.е. будет выведен лог за определенное количество дней, остальные условия выполняются по аналогии, за месяц и за год. Если указан ключ «date» то за начало отсчета берется конкретная дата, указанная через пробел, например «01 05 2011», если мы так же через пробел укажем другую дату, то на экран будет выведен определенный период, указанный в этих датах.

image

А если задать {$_.eventid -eq 529 } то результатом будут все попытки входа с неправильными паролями.

image

Источник

PS.

Пусть автор поста на меня не серчает, кое какие фразы, формулировки исправил.

Cкрипт можно сделал немного изящнее внеся в него изменения:

# Параметры
param ($EventID,$key1,$val1,$StartDate,$EndDate)

# Начальное время суток
$TimeofDay = (get-date).date

if ($val1 -eq $null) {$val1=0};

# Год
if ($key1 -eq «year») {$mydate = ((Get-date $TimeofDay -day 1 -month 1)).addyears(-$val1)}

# Месяц
if ($key1 -eq «month») {$mydate = ((Get-date $TimeofDay -day 1)).addmonths(-$val1)}

# День
if ($key1 -eq «day») {$mydate = $TimeofDay.adddays(-$val1)}

# Конкретная
if ($key1 -eq «date») {$mydate = (Get-date $StartDate)}

# Интервал
if ($key1 -eq «interval») {$After = (Get-date $StartDate);$Before = (Get-date $EndDate)}

# Загружаем массив событий
if (!$After -and !$Before) {$Events = Get-EventLog security -message «*Тип входа:?10*» -after $mydate | ?{$_.eventid -eq $EventID }}
else {$Events = Get-EventLog security -message «*Тип входа:?10*» -after $After -before $Before | ?{$_.eventid -eq $EventID }}

Май 6, 2011

Рестарт задания печати.

Filed under: Windows, PowerShell — Метки: , , , , — Yamshikov Pavel @ 9:01 дп

Задача была сформулирована следующим образом:

Есть сервер с win2008 r2 sp1. На нем развернут терминал 1с, установлены принтеры, порядка 30. К серверу подключаются удаленные объекты, соединенные VPN каналом. Скорость канала варьируется от 96-512 Кбит/с. Периодически, при печати на принтер, задание останавливается ошибкой и висит со статусом «ошибка». Для продолжения работы необходимо открыть принтер, выбрать задание с ошибкой правой кнопкой, и нажать «Перезапустить». Задание перезапускается и печатается.

Так как принтеров большое кол-во и задания зависают ошибкой довольно часто, есть возможность проверять принтеры на ошибку скриптом. В инете нашел такой скрипт:
strComputer = «.»
Set objWMIService = GetObject(«winmgmts:» _
& «{impersonationLevel=impersonate}!\\» & strComputer & «\root\cimv2″)
Set colPrintJobs =  objWMIService.ExecQuery _
(«Select * from Win32_PrintJob where status=’Error’»)
For Each objPrintJob in colPrintJobs
objPrintJob.Resume
Next
Однако, этот скрипт возобновляет печать, только если задание было приостановлено, а перезапускать не хочет. Перезапуск спулера помогает, однако при этом перезапускаются все параллельные очереди на других принтерах. Есть ли метод или скрипт для класса objPrintJob, чтобы перезапустить задание, как это можно сделать визуально?

Собственно cамо решение:

#Определяем способ работы с потоками (threads)
$host.Runspace.ThreadOptions = «ReuseThread»
#Подключаем сборку System.Printing
Add-Type -AssemblyName System.Printing
#Создаем объект PrintServer (для локального компьютера)
$PrintServer = new-object System.Printing.PrintServer
#Получаем перечень очередей печати (PrintQueues)
$PrintQueues = $PrintServer.GetPrintQueues()
#Для каждой очереди печати…
foreach ($PrnQueue in $PrintQueues) {
#…обновим свойства объекта PrnQueue значениями, полученными от принтера
#и утилит очередей печати, запущенных на компьютере

$PrnQueue.Refresh()
#Получаем перечень заданий печати для текущей Очереди печати
$PrintJobs=$PrnQueue.GetPrintJobInfoCollection()
#Для каждого задания печати…
foreach ($PrnJob in $PrintJobs) {
   #…проверяем статус задания
if ($PrnJob.JobStatus.ToString() -like «*error*») {
      #если статус задания, содержит слово error, то перезапускаем задание.
$PrnJob.Restart()
}
}
}

Источник

Апрель 22, 2011

Конференция по виртуализации.

Filed under: another, Windows — Метки: , , — Yamshikov Pavel @ 8:55 дп

21 апреля в славном городе Владивостоке прошла тематическая конференция по виртуализации, на которой было представлено множество интересных докладов, посвященных возможностям организации и управления виртуальной инфраструктурой предприятия. Здесь вы можете увидеть запись онлайн-трансляции данного мероприятия.

Апрель 21, 2011

Windows PowerShell Cheat Sheet.

Filed under: Windows, PowerShell — Метки: , , , — Yamshikov Pavel @ 3:59 пп

Gary Lapointe сделал удобную шпаргалку с описанием команд и отличными примерами, которая очень облегчит жизнь при написании powershell скрипта.

Download Windows PowerShell Cheat Sheet

Источник

Январь 18, 2011

Определяем логин пользователя по его SID средствами MS SQL.

У администратора БД (Microsoft Dynamics NAV), возникла задача выдавать/проверять наличие роли SQL db_datareader для некоторых работников. Но в таблице список пользователей хранился в виде SID windows: S-1-5-21-3879… и записи постоянно добавлялись, т.е.  необходимо было конвертировать из S-1-5-21-38… → aapetrov.
Серверов было около 70-ти и хотелось все сделать стандартными средствами. Как и положено начал с гугла — ничего полезного не нашел. Обратился за помощью на форум sql.ru. Было предложено множество вариантов, за что огромное спасибо добрым людям, но увы, решение так и не было найдено. И вот на грани нервного срыва, проблему все-таки удалось разрешить.

Для начала немного теории. Разберем SID (S-1-5-21-3879291865-2298129343-1096376209-3741) по частям:

  • S — говорит нам о том, что это именно SID;
  • 1 — уровень контроля;
  • 5 — полномочие идентификатора;
  • 21 — первое подчиненное полномочие идентификатора;
  • 3879291865, 2298129343 и 1096376209 — остальные подчиненные полномочия идентификатора, все вместе они обозначают домен или компьютер, который издал идентификатор SID;
  • 3741 — относительный идентификатор.

Более подробно о можно почитать тут.

Теперь сам скрипт. Лучше всего создать функцию, а потом просто вызывать ее с параметром:

--Проверяем существует ли функция, если да то удаляем и создаем.

IF OBJECT_ID (N'dbo.StringSIDToLogin', N'FN') IS NOT NULL
DROP FUNCTION dbo.StringSIDToLogin
GO
CREATE FUNCTION dbo.StringSIDToLogin (@MYSID AS VARCHAR(255))
RETURNS VARCHAR(300)
AS
BEGIN

--получаем бинарное значение

DECLARE @A AS BIGINT ,@B AS BIGINT ,@C AS BIGINT ,@D AS BIGINT
SET @MYSID = REVERSE(@MYSID)
SET @D = REVERSE(SUBSTRING(@MYSID,1,CHARINDEX('-',@MYSID)-1))
SET @MYSID = SUBSTRING(@MYSID,CHARINDEX('-',@MYSID)+1,255)
SET @C = REVERSE(SUBSTRING(@MYSID,1,CHARINDEX('-',@MYSID)-1))
SET @MYSID = SUBSTRING(@MYSID,CHARINDEX('-',@MYSID)+1,255)
SET @B = REVERSE(SUBSTRING(@MYSID,1,CHARINDEX('-',@MYSID)-1))
SET @MYSID = SUBSTRING(@MYSID,CHARINDEX('-',@MYSID)+1,255)
SET @A = REVERSE(SUBSTRING(@MYSID,1,CHARINDEX('-',@MYSID)-1))
declare @sid_sql VARBINARY(100)
DECLARE @StrLogin VARCHAR(100)
set @sid_sql= 0x010500000000000515000000
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@A)))
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@B)))
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@C)))
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@D)))

--теперь с помощью стандартной функции MS SQL находим логин и убираем префикс домена

set @StrLogin=SUSER_SNAME(@sid_sql)
set @StrLogin=REPLACE (@StrLogin,'dom\','')
RETURN (@StrLogin)
END
GO
Осталось только вызвать функцию:

SELECT dbo.StringSIDToLogin('S-1-5-21-1106671424-631848431-2339101832-7032') AS [Login]

Как оказалось всё просто. Саму идею подсказали на форуме.

автор: antonick

Январь 14, 2011

Руководства по Office 2010.

Filed under: Books, Microsoft Office — Метки: , , , , , , — Yamshikov Pavel @ 10:08 дп

На русском языке вышли руководства по Office 2010.

Архив содержит руководства по всем продуктам, кроме Lync, входящим в состав Office Professional Plus 2010. Каждое руководство представляет 70-страничный pdf-файл.

Скачать руководства (28 Мб)

Предыдущие записи »

Theme: Silver is the New Black. Блог на WordPress.com.

Follow

Get every new post delivered to your Inbox.