Я везде читаю, что PowerShell это путь в будущее. Когда он был впервые выпущен, я провел множество виртуальных лабораторных работ, но с тех пор я до сих пор не использовал его в производственной среде. Я знаю, что наступит день, когда я буду иметь дело с ОС, в которой она уже установлена, поэтому я хочу быть готовым.
Я хочу знать:
Кажется, что все согласны с тем, что Microsoft прилагает все усилия, но на самом деле никто еще этим не пользуется. Я хочу услышать от системных администраторов, которые используют его для выполнения повседневных задач, и поделиться некоторыми примерами кода.
Microsoft делает все возможное, чтобы сделать PowerShell выбором опытных пользователей и разработчиков средств автоматизации во всем мире. Прошли времена компиляции кода в .NET для того, чтобы делать то же самое, теперь вам просто нужны notepad.exe и google. Мы большие поклонники этого в офисе, тем более что консоль управления Exchange 2007 НЕ включает в себя все, что вы можете делать в PowerShell. Microsoft сознательно не реализовала вещи, которые выполняются лишь раз в долгое время, проще разрабатывать таким образом, что прямо вынуждает их использовать, если у вас есть что-то, напоминающее сложную среду.
Управление продуктами нового поколения Microsoft (Win7, Windows Server 2008, Exchange 2007/2010, SQL Server 2008) имеет очень богатые возможности PowerShell. Как только Remote Powershell (PowerShell 2.0 IIRC) будет развернут с Server 2008 R2, он станет еще БОЛЬШЕ полезным для разработчиков средств автоматизации.
Что мы с ним сделали:
Так что да, PowerShell будет с нами довольно долгое время.
РЕДАКТИРОВАТЬ: Добавление образца кода, поскольку он был запрошен
$list=import-csv("groupusers.csv") $lastseengroup=$list[0].group $ADGroupPrefix="grp.netware." $ADGroupSuffix="{redacted -- in the format of ,ou=groups,dc=domain,dc=domain,dc=domain}" Clear-Variable memberlist Clear-Variable unknownusers foreach ($entry in $list) { if ($($entry.group) -ne $lastseengroup) { echo "stumbled across new group $($entry.group), committing changes to $lastseengroup" $newgroup=$ADgroupPrefix+$lastseengroup $newgroupdn='"'+"cn=$newgroup$ADGroupSuffix"+'"' echo "getting DN for $newgroup" $existinggroup=dsquery group domainroot -name $newgroup if (($existinggroup -ne $null)) { dsmod group $newgroupdn -chmbr $memberlist } else { dsadd group $newgroupdn -scope u -secgrp yes -members $memberlist -desc "Group imported from eDirectory" } Clear-Variable memberlist } $User=get-user $($entry.member) -ErrorAction SilentlyContinue if ($User.isvalid) { $UserDN=$User.distinguishedname $memberlist=$memberlist+'"'+"$UserDN"+'" ' } else { $unknownusers=$unknownusers+$($entry.member) } $lastseengroup=$($entry.group) } dsadd group "cn=$ADGroupPrefix$lastseengroup$ADGroupSuffix" -scope u -secgrp yes -members $memberlist
Это берет CSV-файл, созданный с помощью сценария perl, и обновляет набор групп. Если группа уже существует, она заменяет членство на то, что указано в файле. Если группа не существует, она ее создает. Это односторонняя синхронизация. Кроме того, не вполне в производстве пока нет, но близко.
Учитывая, что серверные продукты Microsoft с самого начала будут поддерживать PowerShell (я считаю, что в следующей версии Exchange все config, доступный через PowerShell), и книги вроде PowerShell на практике описать несколько отличных способов автоматизации монотонных задач. Я думаю, что разумно предположить, что PowerShell еще какое-то время будет преобладающей технологией в серверной среде Windows.
Я бы рекомендовал Подкаст Скотта Хансельмана № 162. Похоже, что все серверные команды Microsoft «вынуждены» предоставлять командлеты PowerShell, а также следовать единому согласованному синтаксису.
Кроме того, третьи стороны любят VMWare принимают это
Короче говоря, я считаю, что PowerShell, начиная с версии 2.0, серьезно занимается заменой командных файлов для всех, кроме самых тривиальных задач.
Десять сценариев PowerShell, которые я использую как администратор базы данных SQL Server (все они описаны / опубликованы на мой блог):
Какие задачи администратора вы написали с его помощью?
мониторинг приложений / служб: получение ключевых показателей производительности из (удаленного) журнала событий и хранимых процедур и их отображение из одного пакетного файла
Я администратор базы данных SQL Server, покажите мне, что с ним можно сделать?
automssqlbackup: ежедневное резервное копирование для MSSQL с ротацией (ежедневно = инкрементное, еженедельное + ежемесячное = полное; хранить 5 ежедневных, 5 еженедельных резервных копий), архивирование, уведомление по электронной почте
Я подумал, что это круто: с SQL Server 2008 вы получаете новые расширения PowerShell, которые позволяют вам перемещаться по базам данных SQL так же, как по вашей локальной файловой системе или реестру.
После установки инструментов клиента SQL Server вы можете открыть любую базу данных в PowerShell (через контекстное меню, щелкнув правой кнопкой мыши) и поэкспериментировать с ней объектно-ориентированным способом:
PS SQLSERVER:\SQL\MyServer\MyInstance\Databases\ExampleDB\>function prompt {"PS >"}
PS >cd tables
PS >dir
SCHEMA NAME CREATED
------ ---- -------
dbo MyTable 25/06/2009 17:02
PS > dir | format-table name, columns, rowcount, parent
NAME COLUMNS ROWCOUNT PARENT
---- ------- -------- ------
MyTable {Id, Name} 0 {ExampleDB}
PS >$myTable = dir | where {$_.Name -eq "MyTable"}
PS >$myTable.Script()
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[MyTable](
[Id] [int] IDENTITY(1,1) NOT NULL
[Name] [nText] NOT NULL
) ON [PRIMARY]
PS >set-location \SQL\AnotherServer\Default
PS >cd databases\Northwind\tables
PS >$myTables = dir | where {$_.Rowcount -gt 100 -and $_.HasIndex -eq 1}
PS >$myTables.Count
8
PS >foreach ($table in $tables) {$table.RebuildIndexes(90)}
Обратите внимание, что первая строка просто изменяет приглашение, чтобы оно не было таким длинным.
Надеюсь, помимо этого, что здесь происходит, очевидно :)
Используя сценарии оболочки unix в предыдущей карьере, а затем перейдя к администрированию сервера Windows, я могу сказать, что я очень, очень ценю PowerShell - у меня нет времени и возможности выучить слишком много тайного синтаксиса, и я был приятно удивлен тем, что много сценариев PowerShell можно написать очень простым языком ... берите то, что стоит, поскольку я привык к ksh !!
Я предсказываю, что это будет еще долго.
SQL Server 2008 теперь имеет параметры контекста PowerShell в Management Studio, поэтому они используются не только в Exchange. Кроме того, думайте об этом как о замене DOS, поскольку это в значительной степени то, о чем думала MS, поскольку они просто не могут улучшить безопасность DOS для проблем с обратной совместимостью, поэтому они просто создали что-то новое, и проблема решена!
Я тоже администратор базы данных и давний скрипт, возвращаюсь к пакетным файлам DOS, V3.3! Перешел на VB Script, но PS очень мощный. Взгляните на - Извините, я не могу опубликовать ссылку, так как я новый пользователь. Получил это из блога Отто Хельвега. Это дешевый и удобный инструмент для инвентаризации программного обеспечения.
Пример сценария PowerShell:
# Open the database connection
$dbConn = new-object System.Data.SqlClient.SqlConnection "server=kcdb;database=Inventory;Integrated Security=sspi"
$dbConn.Open()
$sqlQuery = $dbConn.CreateCommand()
# Get all known computers
$sqlQuery.CommandText = "select * from Inventory..Computers"
$reader = $sqlQuery.ExecuteReader()
$computersToQuery = @()
while ($reader.Read()) {
$computersToQuery += $reader["Computer"]
}
# Close the database connection
$dbConn.Close()
$softwareInventory = @{}
foreach ($computer in $computersToQuery) {
$psinfoOutput = ./psinfo.exe -s Applications \\$computer
$foundSoftwareInventory = 0
$computerName = ""
foreach ($item in $psinfoOutput) {
if ($foundSoftwareInventory -eq 1) {
# Force the results to a string
# Remove any single quotes which interfere with T-SQL statements
# Load the result into a hash whereby removing any duplicates
[string]$softwareInventory[$computerName][$item.Replace("'","")] = ""
}
if ($item -like "System information for *") {
$computerName = $item.Split("\")[2].TrimEnd(":")
} elseif ($item -eq "Applications:") {
$foundSoftwareInventory = 1
$softwareInventory[$computerName] = @{}
}
}
}
$dbConn = new-object System.Data.SqlClient.SqlConnection "server=kcdb;database=Inventory;Integrated Security=sspi"
$dbConn.Open()
$sqlQuery = $dbConn.CreateCommand()
foreach ($computer in $softwareInventory.Keys) {
foreach ($softwareItem in $softwareInventory[$computer].Keys) {
"Loading-" + $computer + ":" + $softwareItem
# Try an Update then an Insert
trap {
$sqlQuery.CommandText = "update Inventory..SoftwareInventory set AuditDate = getdate() where Computer = '" + $computer + "' and Software = '" + $softwareItem + "'"
$result = $sqlQuery.ExecuteNonQuery()
continue
}
$sqlQuery.CommandText = "insert into Inventory..SoftwareInventory (Computer,Software,AuditDate) values ('" + $computer + "','" + $softwareItem + "',getdate())"
$result = $sqlQuery.ExecuteNonQuery()
}
}
$dbConn.Close()
Дэйв Дж.
Следующие задачи выполняются моей командой на регулярной основе с помощью PowerShell.
Изо дня в день у меня всегда есть подсказка PS, и я использую ее для любых разовых задач, для которых я использовал CMD.
Вот несколько примеров кода для чтения списков Sharepoint. Я использую веб-службы из Sharepoint и новый командлет «New-WebServiceProxy» в PowerShell V2.0.
$url = "http://server/sites/site/_vti_bin/lists.asmx"
$listWebService = new-webServiceProxy -uri $url -UseDefaultCredential
$listName = "MyList"
$viewGuid = $null
$query= $null
$viewFields = $null
$numRowsReturned = 20000
$queryOptions = $null
$result = $listWebService.GetListItems($listName,$ViewGuid,$query,$viewFields,$numRowsReturned,$queryOptions,$null)
Ойсин Грехан имеет отличное сообщение в блоге об использовании веб-служб Sharepoint которую я использовал в качестве основы для создания всех своих функций. У него даже есть замечательный скрипт new-webservice.ps1, который вы можете использовать, если все еще используете PowerShell V1.
Кроме того, вот базовая функция, которую я использовал для получения доступной памяти на узлах в моем кластере.
Function Get-AvailableMemory {
param
(
[string[]]
$servers
)
BEGIN {
$query = "select AvailableBytes,__SERVER from Win32_PerfRawData_PerfOS_Memory"
$availableMemory = @{
Name="AvailableMemory";
Expression = {[math]::round($_.AvailableBytes/1gb,2)}
}
$serverName = @{
Name ="Server";
Expression = {$_."__SERVER"}
}
}
PROCESS {
foreach ($server in $servers){
get-wmiobject -query $query -computer $server |
select-object $availableMemory, $serverName
}
}
END {}
}
Я попробовал PowerShell для небольшого проекта на работе - ежедневная миграция подмножества ~ 600 пользователей и ~ 200 групп из корпоративной ОБЪЯВЛЕНИЕ в старую систему UNIX, используя CSV-подобные файлы. Мне предложили 500-строчный VBScript скрипт (!), который выбрал одну группу и ее пользователей в качестве отправной точки.
Оказалось, что сценарий PowerShell из 20 строк может сделать все ...
Как пользователь * NIX (на стороне сервера и клиента) я был очень приятно удивлен PowerShell. Даже если вы знаете лишь небольшое подмножество команд, вы можете выполнять с ним действительно эффективную работу. я просто хотел SSH(-подобный) удаленный доступ ...
У меня есть целый набор сценариев управления / инвентаризации, которые ищут в AD разные вещи и запрашивают их через WMI для получения важной статистики, такой как общие ресурсы на сервере, дисковое пространство, используемое дисковое пространство и т. Д.
Общие сценарии:
Пользовательские скрипты:
У меня есть тот, который перечисляет все гостевые машины VMWare на моих серверах ESX
У меня есть сценарий, который захватывает файлы через x дней и безопасно удаляет их.
В основном я могу сделать то, что заняло около 200 строк VBScript, и сделать это с помощью 10 PowerShell. Вы также можете делать вещи, которые вы просто не можете делать или делать хорошо в VBScript - например, отправлять электронные письма с вложениями - что я делаю регулярно, чтобы отправлять мне результаты своих скриптов. Также вы можете записывать значимые и уникальные записи в журнал событий с настраиваемыми именами служб и идентификаторами событий.
Это то, что я могу придумать прямо в голове. Сейчас я предпочитаю PowerShell, он просто облегчает жизнь.
По сути, это примерно так же полезно для системного администратора, как сценарии Bash для администратора Unix.
Powershell не идеален, но если вы использовали его, то знаете, что это довольно круто. Имея доступ ко всей библиотеке .net плюс встроенные командлеты (и создавайте свои собственные командлеты с помощью PS в 2.0), это довольно круто.
Единственное, чего мне не хватает, так это хорошей среды разработки, которая, я уверен, когда-нибудь придет от MS. Прямо сейчас я использую Idera Powershell Plus и adminscripteditor, которые позволяют отладку и довольно крутые.
Мне удалось довольно хорошо отучить себя от VB.
На сегодняшний день мой самый большой проект с posh - это использовать "powershellASP" для создания базовой веб-страницы, которая запускает команды PowerShell и извлекает информацию о хостах vmware и виртуальных машинах с моих более чем дюжины хостов VMWare ESXi (бесплатных) и отображает их в таблицах HTML. Я сделал это, потому что с бесплатным VMWare ESXi и без виртуального центра нет другого способа получить обзор всех моих виртуальных машин в компании в режиме реального времени. PowershellASP - это бесплатный сторонний парсер, написанный для IIS и не поддерживаемый MS. Так что прямо сейчас он может делать некоторые ограниченные действия, а документация довольно скудна.
Как мне не пользоваться? Все выходящие / обновляемые серверные приложения Microsoft теперь управляются с помощью Powershell. Затем предоставляется более или менее раздражающий пользовательский интерфейс / консоль управления, построенная поверх этого ядра, которое часто работает медленно и, как кто-то указал, не имеет доступных функций ... поэтому я не могу сказать, что у нас на самом деле большой выбор ^ ^
Это скорее ответ разработчика, но это реальный мир, и мы начнем его тестирование в какой-то момент в следующие несколько месяцев. Я начинаю изучать PowerShell, чтобы писать сценарии, чтобы переносить задачи SQL Server в нашу непрерывная интеграция Окружающая среда. Скрипты непрерывной интеграции будут запускаться в основном NAnt и MSBuild через Команда JetBrains TeamCity.
В дополнение к этому, я собираюсь перейти на PowerShell в качестве основной командной оболочки Windows для общего назначения и особенно для задач администрирования базы данных SQL Server.
Извините, у меня пока нет примеров кода, которыми можно поделиться, потому что я все еще учусь! Я буду рад опубликовать некоторые, когда это сделаю :)
Вот пример однострочного кода, которым я только что ответил на другой ваш вопрос :) Но что ж, для вики ...
Это будет список установленных исправлений:
Get-ChildItem -Path “HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix”
Мои администраторы Windows пока не используют PowerShell. Все они слышали об этом, но у них не было времени познакомиться с этим.
Решил сам посмотреть. Исходя из опыта работы с оболочкой Unix, я подумал, что в Windows наконец-то должна быть настоящая среда программирования оболочки. Я думаю, что у Microsoft кое-что получилось с PowerShell, а кое-что не очень.
Положительным моментом является использование ими объектов в качестве посредника между командлетами в PowerShell. Это придает PowerShell такой уровень мощности, который текстовые сценарии должны взламывать, чтобы приступить к работе.
С другой стороны, они действительно не используют большую часть команд оболочки Unix. Таким образом, кривая обучения излишне крута и не помогает людям легко переходить с Unix на PowerShell или наоборот. Самое большее, что они делают, это определяют псевдонимы для некоторых командлетов PowerShell, таких как ls сглаживание Get-ChildItem со всеми переключателями командной строки разные.
Всего два цента ...
Мы используем его для довольно многих административных задач, в основном это магазин Microsoft. Некоторые сценарии просты, например, очистка старых файлов или дефрагментация машин и запись результатов. Один сценарий проверяет компьютеры, в основном использующие WMI, и записывает результаты в базу данных. Он получает такие вещи, как оборудование (ЦП, ОЗУ, диски и т. Д.), Сетевую информацию, локальных пользователей, установленное программное обеспечение и информацию о профиле. Один из них вызывает веб-службу для отправки электронной почты. Думаю, в будущем он заменит остальные VBScript скрипты, которые все еще используются. Мы пока не используем его для задач Exchange или SQL Server.
Я с нетерпением жду следующей версии, в которой будет поддержка фоновых заданий, транзакций, улучшенная обработка исключений, новая ISE (интегрированная среда сценариев), улучшенная отладка и т. Д.
Автоматизация определенных вещей с помощью проверок серверов, на которых я работаю (сбор базовой информации из WMI и сбор ошибок и предупреждений из журналов событий).
Обработка журналов событий потрясающая.
Недавно я написал сценарий для отключения всплывающего окна автоматического обновления, которое Foxit Reader включило по умолчанию в домене, в котором выполняется сценарий. Он извлекает список компьютеров из AD, затем проверяет, работает ли он, затем меняет 1 на 0.
Одно я забыл!
У вас почти полный доступ к библиотекам .NET. Немного больно делать с ним действительно сложные вещи, но если у вас есть необходимость, он есть для вас.
Не будучи разработчиком .NET, я ограниченно использую все связанные с .NET полезности, которые позволяет вам использовать PS. Однако, будучи администратором Exchange (помимо прочего), интеграция PowerShell для Exchange 2007 УДИВИТЕЛЬНАЯ. Наконец-то у меня появился надежный скриптовый движок для моей почтовой системы; до сих пор он отправлял мне ежемесячную статистику по почтовым ящикам каждого, настраивал, кому назначены различные адреса электронной почты в зависимости от времени суток, автоматически создавал и назначал разрешения для общих папок и балансировал нагрузку пользователей между нашими двумя базами данных почтовых ящиков . Еще одна интересная вещь с точки зрения Ex07 заключается в том, что после того, как вы сделаете что-либо в графическом интерфейсе, он представляет вам соответствующие команды PowerShell для того, что вы только что сделали. Скопируйте их, и в конечном итоге у вас будет набор сценариев PS, который сможет заново создать вашу среду Exchange с нуля.
Я искал poweshell для замены наших клиентских пакетных сценариев - запущенных программ, сценариев входа в систему и т. Д.
Но обнаружил, что это добавляет как минимум 10 секунд ко времени входа в систему - это со всеми "настройками" на месте. В итоге мы остались с тем, что использовали.
Хотя это не самый простой язык сценариев для понимания (предполагается солидный опыт работы с трубами), и он имеет свои собственные странности (дайте мне просто sedкак штука !!), я считаю PowerShell достаточно мощным. Не до уровня Баш или другие оболочки Unix, но все же.
Я использую его для контроля экспорта и импорта некоторых баз данных с предупреждениями по электронной почте на случай, если что-то пойдет не так, а также для выполнения некоторых рутинных пакетных операций.
Это определенно уже моя основная оболочка Windows, хотя на самом деле это не тот тип «пиши меньше, делай больше». PowerShell играет против своей многословности (и наследования .NET).
PowerShell версии 1.0 был сильно ограничен во многих аспектах, но версия 2.0 идет неплохо. По сравнению с пакетными скриптами он намного мощнее. На самом деле я не использую его как оболочку, только для скриптов, поэтому мой опыт окрашен соответствующим образом. Мне не очень нравится синтаксис (-eq
против ==
, -gt
против >
и т. д.), но я ценю возможность погрузиться в .СЕТЬ если мне нужно сделать что-то странное. Думаю, что к версии 3.0 будет здорово. Сейчас я бы твердо поставил его в категорию «выполняет свою работу».
Я использую его в основном для автоматизации развертывания кода. Это та область, где лучше всего создавать что-то на C #. Связанные с оболочкой операции, такие как рекурсивное копирование каталогов и другие вещи, которые скриптеры Bash считали само собой разумеющимся в течение многих лет, значительно упрощают работу.