Welcome to TechNet Blogs Sign in | Join | Help

Управление службами Remote Desktop (так же известны как службы терминалов) с помощью Windows PowerShell

Всем привет,

Мы рады сообщить, что бета-версия Windows server 2008 R2 поддерживает использование PowerShell в службах Remote Desktop. Теперь вы можете настраивать и управлять всеми службами и компонентами ролей RDS с помощью PowerShell. Например, ниже приведены несколько задач управления, которые теперь можно выполнять с помощью PowerShell

  1. Просмотр и редактирование настроек конфигурации сервера удаленного рабочего стола
  2. Публикация приложений RemoteApp
  3. Настройка сервера лицензий
  4. Создание и настройка фермы сервера удаленного рабочего стола
  5. Настройка и назначение виртуальных IP-адресов для сеансов и приложений
  6. Создание и управление RDV (VDI пулами)
  7. Создание и управление политиками Gateway Resource Access и Client Access

Разумеется, с помощью Windows PowerShell можно сделать еще многое и многое другое. Установите бета-версию Windows Server 2008 R2 и давайте попробуем. Как всегда, мы очень хотим услышать, что вы думаете, и важно, чтобы вы как можно скорее дали нам знать, что вам понравилось, и что не понравилось.

Читайте дальше, чтобы подробно разобраться в PowerShell RDS.

PowerShell в службах удаленного рабочего стола

После установки роли служб Remote Desktop устанавливается провайдер PowerShell. Этот провайдер (в дальнейшем мы будем называть его провайдером RDS) позволит вам просматривать и управлять конфигурацией всех служб роли и компонентов служб Remote Desktop.

Думайте о провайдере RDS как о чем-то вроде провайдера файловой системы и провайдера реестра, провайдера IIS. Вы можете просматривать, обозревать свойства и работать с провайдером RDS так же, как и с любым другим провайдером.

Работа с RDS из PowerShell

Чтобы начать работу, сперва установите роль служб Remote Desktop и запустите RDS PowerShell.

Шаг 1: Установите роль служб Remote Desktop

RDS PowerShell устанавливается при установке роли служб Remote Desktop. Роль служб Remote Desktop можно установить с помощью Server Manager.

Шаг 2: Запустите RDS PowerShell

Щелкните левой кнопкой мыши на Start Menu -> All Programs -> Administrative Tools -> Remote desktop services -> «Remote Desktop Services PowerShell» и выберите «Run as Administrator».

После щелчка по этой ссылке вы увидите окно PowerShell, подсказка будет указывать на устройство RDS. Это он – ваш провайдер RDS.

Отметим, что когда вы используете команду dir, вы увидите представление со следующими шестью столбцами.

Name (Имя): Имя контейнера/параметра

Type (Тип): Тип элемента. Существует три возможных значения типа – Container (Контейнер), Integer (Целое число) и String (Строка). Контейнер (Узел) определяет элемент контейнера, а Целое и Строка обозначают настройки. Входить командой CD можно только в элементы контейнеров. Контейнеры соответствуют группам настроек или логической сущности, тогда как настройки соответствуют параметрам конфигурации. Например, роли, такие как RDS и Connection Broker, и сущности, такие как объекты соединений и RemoteApps, представляются в форме контейнеров, а режим стока сервера (drain mode) представлен как параметр.

CurrentValue (Текущее значение): Значение, назначенное элементу (применимо только для элементов типа «Integer» или «String»)

GP: Указывает, управляется ли элемент с помощью групповых политик

PermissibleValues (Разрешенные значения): Возможные значения, которые может иметь элемент настроек

PermissibleOperations (Разрешенные операции): Операции (коммандлеты), которые могут применяться к элементу

Пользователи могут выбирать, какие столбцы должны выводиться при использовании коммандлета Format-table. Например, команда Get-Item * | format-table -Property Name, CurrentValue выводит только столбцы Name и CurrentValue. Можно использовать также dir * | ft -Property N*,C* , , вы получите тот же результат.

Можно также изменить вид по умолчанию. Дополнительные сведения об этом см. в следующем сообщении.

Как прочитать справочное руководство?

Одна из выдающихся возможностей PowerShell состоит в том, что он упрощает получение информации и справки по различным вопросам. Это преимущество сохраняется и для поставщика RDS. Существует свойство с именем Description (Описание), ассоциированное с каждым элементом, которое успешно описывает отдельные параметры.

Например, PS RDS:\RDSConfiguration> get-item .\DrainMode| fl выводит информацию об элементе DrainMode. Также можно изменить представление по умолчанию так, чтобы в нем всегда показывалось содержимое столбца Description.

Теперь давайте рассмотрим примеры.

Пример 1: Установка уровня шифрования RDP

Шаг 1: Просмотр текущего уровня шифрования

PS RDS:\RDSConfiguration\Connections\RDP-Tcp\SecuritySettings> dir .\EncryptionLevel | fl

Шаг 2: Установка требуемого значения элемента EncryptionLevel

PS RDS:\RDSConfiguration\Connections\RDP-Tcp\SecuritySettings> Set-Item .\EncryptionLevel 2

Пример 2: Определение серверов лицензий, которые будут использоваться сервером Remote Desktop

Шаг 1: Просмотр текущего списка используемых серверов лицензий

PS RDS:\RDSConfiguration\LicensingSettings\SpecifiedLicenseServers> dir

Шаг 2: Просмотр списка серверов лицензий, зарегистрированных на контроллере домена.

PS RDS:\RDSConfiguration\LicensingSettings\RegisteredLicenseServers> dir

Шаг 3: добавление сервера лицензий к списку SpecifiedLicenseServers

Простейший способ добавления сервера лицензий состоит в том, чтобы использовать коммандлет new-item и указать имя добавляемого сервера лицензий.

PS RDS:\RDSConfiguration\LicensingSettings\SpecifiedLicenseServers> New-Item -name ls.contoso.com

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

PS RDS:\RDSConfiguration\LicensingSettings\SpecifiedLicenseServers> dir ..\RegisteredLicenseServers | new-item –force

Пример 3: Подключение сервера Remote Desktop к ферме Session Broker

PS RDS:\RDSConfiguration\ConnectionBrokerSettings> Set-Item MemberOfFarm 1 -FarmName testFarm -sessionbroker contoso-sb-test -CurrentRedirectableAddresses 65.52.65.53

Пример 4: Добавление RemoteApp

PS RDS:\RemoteApps\PublishedApplications> New-Item -Name "IExplore" -ApplicationPath "c:\Program Files\Internet Explorer\iexplore.exe" -ApplicationName "Internet Explorer" -ShowInPortal 1

Эти примеры демонстрируют лишь некоторые из различных новых возможностей. Практически любые задачи настройки, относящиеся к конфигурации сервера RD, RemoteApp, Gateway, сервера лицензий и RDV (VDI пулами) теперь можно выполнять с использованием провайдера RDS.

Кроме того, истинный потенциал провайдера RDS реализуется при написании сценариев для

1. формирования последовательности из различных операций настройки

2. выполнения настройки нескольких серверов

Один из сценариев, наилучшим образом демонстрирующих указанное выше, это создание ферм серверов RD. Сценарий, приводимый в качестве примера в конце этой записи, принимает в качестве входных данных список серверов и приложений, создает ферму сервера RD и создает RemoteApp на всех этих серверах. Создайте два текстовых файла, один со списком серверов и другой со списком путей к приложениям (можно использовать пути с переменными среды, такими как %windir%), и передайте имена этих файлов сценарию в качестве входных параметров.

Поскольку эти сценарии используют удаленное исполнение PowerShell, перед выполнением сценария убедитесь, что вы включили удаленное исполнение PowerShell (для включения удаленного исполнения выполните коммандлет Enable-PSRemoting в окне PowerShell запущеном с повышеными привилегиями).

Разумеется, это очень простой сценарий – вы можете легко нарастить его дополнительными специальными функциями в соответствии с вашими потребностями. Кроме того, по нашему мнению, одно из важных преимуществ провайдера RDS состоит в том, что вам нет нужды быть программистом, чтобы написать такой сценарий, как CreateRDFarm. Все, что нужно знать – это основы языка сценариев PowerShell.

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

Приложение: Пример сценария

#Windows PowerShell script to create a RD Server farm. if ($args[0] -eq $null -or $args[1] -eq $null -or $args[2] -eq $null ){ Write-Host "Insuffecient parameters.`nUsage: CreateRDFarm.ps1 SessionBroker Farmname <File containing list of RDS servers > < File containing Applications to publish > exit }else{ $sb = $args[0] $farmname = $args[1] } $rdsarr = get-content $args[2] if ($rdsarr -eq $null){ Write-Host "$args[2] cannot be read or is empty.`nUsage: CreateRDFarm.ps1 SessionBroker Farmname < File containing TS servers > < File containing Applications to publish > exit } if ($args[3] -eq $null){ Write-Host "No file containing Apps Servers specifed. TS Remote Apps will not be published.`nUsage: CreateFarm.ps1 SessionBroker Farmname < File containing TS servers >

< txt file containing Applications to publish > .`n Farm creation will continue" -ForegroundColor yellow }else{ $apparr = get-content $args[3] if ($apparr -eq $null){ Write-Host "$args[3] cannot be read or is empty.`nUsage: CreateRDFarm.ps1 SessionBroker Farmname < File containing TS servers > < File containing Applications to publish >" } } # Check whether session broker service is running on the remote machine $sbservice = Get-Service -ComputerName $sb -Name Tssdis if( $sbservice.status -ne "Running"){ Write-host "Session Broker service is not running on $sb. Exiting farm creation" exit } if ($rdsarr[0] -eq $null){ Write-Host "No TS Server specified. Atleast one TS Server need to be specified.`nUsage: CreateFarm.ps1 SessionBroker Farmname TS1 TS2 ..." exit } #create a run space to run remote commands on the Session Broker server $sb_remotesession = New-PSSession -ComputerName $sb foreach ($rds in $rdsarr){ #add ts server to Session Broker Computers group on SB server $tst = $rds+"$" invoke-command $sb_remotesession -ScriptBlock { net localgroup 'Session Broker Computers' /add $args[0] 2>$null;` } -ArgumentList $tst #join each ts server to sb farm. Write-Host "Joining RD server $rds to $farmname farm" -ForegroundColor magenta $rds_remotesession = New-PSSession -ComputerName $rds invoke-command $rds_remotesession -ScriptBlock { ` import-module RemoteDesktopServices ;` $cipaddr = dir RDS:\RDSConfiguration\ConnectionBrokerSettings\RedirectableAddresses ;` Set-Item RDS:\RDSConfiguration\ConnectionBrokerSettings\MemberOfFarm 1 -FarmName $args[0] -sessionbroker $args[1] -IPAddressRedirection 0 -CurrentRedirectableAddresses $cipaddr[0].Name ;` }` -ArgumentList $farmname,$sb #create ts remote apps if ($args[3] -ne $null){ foreach ($app in $apparr){ Write-Host Publishing $app on $rds -ForegroundColor magenta $ind = $app.LastIndexof("\") $alias = $app.SubString($ind+1,$app.LastIndexOf(".")-$ind-1) invoke-command $rds_remotesession -ScriptBlock { ` new-item -Path RDS:\RemoteApps\PublishedApplications -Name $args[0] -ApplicationPath $args[1]` }` -ArgumentList $alias,$app } } #close the remote session Remove-PSSession $rds_remotesession } #close the sb runspace Remove-PSSession $sb_remotesession

Шанмугам Каландайвел (Shanmugam Kulandaivel)
Remote Desktop Virtualization Services Team

Перевод: Виктор Горбунков

Posted by abeshkov | 0 Comments

Использование PowerShell для защиты от Conficker (включение и отключение AutoRun.inf)

На главной странице MSN.com сегодня приведены сведения о новом черве, Conficker, который распространяется через старые добрые трюки с autorun.inf. Он инфицирует устройства USB так, что при подключении этих устройств в другой компьютер вредоносный код автоматически запускается и поражает машину. Статья ссылается на публикацию в блоге Ника Брауна (Nick Brown), который описывает различные способы отключения файлов autorun.inf и дает файл .REG для отключения autorun.inf.

Вот этот файл .REG:

REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping\Autorun.inf]
@="@SYS:DoesNotExist"

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

function Disable-AutoRun
{
    $item = Get-Item `
        "REGISTRY::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping\AutoRun.inf" `
        -ErrorAction SilentlyContinue
    if (-not $item) {
        $item = New-Item "REGISTRY::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping\AutoRun.inf"
    }
    Set-ItemProperty $item.PSPath "(default)" "@SYS:DoesNotExist"
}

 

 

Вот пояснения Ника о том, как это работает:

Этот хак предлагает Windows очистить AUTORUN.INF так, как если бы он был файлом конфигурации старого приложения до времен Windows 95. IniFileMapping – это ключ, который сообщает Windows, как работать с файлами .INI, которые это приложение обычно использует для хранения данных о настройках (практиковалось до появления реестра). В этом случае он сообщает: «когда начнете работать с файлом AUTORUN.INF, не используйте значения из файла. Используйте альтернативные значения из HKEY_LOCAL_MACHINE\SOFTWARE\DoesNotExist». И поскольку этот ключ, точно, не создан, дело обстоит так, как если бы AUTORUN.INF был совершенно пуст, так что никакого автозапуска, и к двойному щелчку в Обозревателе ничего не добавляется. Результат: черви не запускаются – если только вы двойным щелчком не запустите исполняемые файлы, чтобы посмотреть, что они делают. В этом случае вы заслужили, чтобы ваш ПК был заражен.

Если вы захотите отменить изменения в реестре и снова включить автозапуск, можно использовать приведенную ниже функцию:

function Enable-AutoRun
{
    Remove-Item "REGISTRY::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping\AutoRun.inf" -Force
}

Надеюсь, это вам поможет,

Джеймс Брандейдж (James Brundage) [MSFT]

Перевод: Виктор Горбунков

Posted by abeshkov | 2 Comments

Коммандлеты групповых политик в Windows 7

Лилия Гутник (Lilia Gutnik) опубликовала ЗДЕСЬ запись с примером коммандлетов групповых политик Windows 7. Посмотрите.

Экспериментируйте, не скучайте, подключайтесь!

Джеффри Сновер (Jeffrey Snover) [MSFT]
Windows Management Partner Architect
Посетите английский блог команды  Windows PowerShell:    http://blogs.msdn.com/PowerShell
Посетите Windows PowerShell ScriptCenter:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Перевод: Виктор Горбунков

Posted by abeshkov | 1 Comments

Отладка сценария PowerShell с помощью редактора ISE

Привет, писатели и потребители сценариев с ошибками.
В этом сообщении описываются основы работы с графическим отладчиком в ISE. Здесь приведено множество отличных рекомендаций, а также несколько советов и трюков.
Отладчик поддерживает как коммандлеты, так и пользовательский интерфейс. Коммандлеты включают Enable/Disable/Get/Set/Remove-PsBreakpoint и Get-PsCallStack.
Основной способ работы – расставить в сценарии точки останова, продолжать работу (F5) для перехода от одной точки останова до другой и проходить функции, входить и выходить из них для перемещения по программе. Также можно использовать стек вызовов и указывать на переменные для получения их значений.


Точки останова

Добавить точку остановка в строку просто, в любом сценарии нужно нажать клавишу F9 или воспользоваться контекстным меню (Enable Breakpoint). Однако их можно добавлять только в сохраненные сценарии. Так что если у вас есть файл untitled.ps1, сначала сохраните его с именем «powershellmademesaveyou.ps1». Так же можно работать с файлами psm1. Точки останова можно ставить на самые разные строки, вы сможете увидеть как они работают в любых циклах, в блоках сценариев, в блоках if-else, в ловушках и т.д..
Специальные точки останова можно добавлять с помощью Set-PSBreakpoint (сокращение «sbp»). Например, «sbp -command write-error» перенесет вас к команде, когда она будет исполняться, а «sbp -variable servername» будет останавливать исполнение при изменении содержимого (или обращении) к переменной $servername. Эти точки останова не выводятся на экран и должны устанавливаться/удаляться через командную строку.
Чтобы просмотреть список таких точек, перейдите к Debug->List Breakpoints.
Их можно также легко удалить через контекстное меню или клавишей F9 (или через меню Debug, а также коммандлетом remove-psbreakpoint)
Точки останова также можно добавлять при остановке отладчика, но не во время активного исполнения сценария.


Навигация и исследование


Навигация и исследование в ISE оформлены очень аккуратно. Для перехода от одной точки останова к другой воспользуйтесь командой Continue (F5). Чтобы перешагнуть функции нажмите F10, для входа в функцию - F11, а для выхода из функции - Shift-F11. Во время навигации легко добавить новые контрольные точки, которые можно использоваться для перешагивания через функции.
ISE автоматически откроет сценарий, в котором находится вызванная функция.
Оказавшись в интересующей вас точке, вы можете:
- Установить курсор на переменную, чтобы увидеть ее значение. Это очень быстрый способ узнать, что происходит
- Выполнить выделенный фрагмент с помощью клавиши F6. Вы можете выполнить условие блока if, чтобы узнать результат. Вы можете выполнить часть строки сценария, независимо от остального фрагмента.
-          Выполнить команду в панели команд. Вы можете проверить сложное выражение с полными настройками. Также здесь можно изменить значения переменных.
- Получить стек вызовов (Ctrl-Shift-D), чтобы узнать, как глубоко лежит ваша проблема
- Запросить справку по коммандлету, выбрав его с помощью мыши и нажав F1
Возможно это подходящий момент прекратить отладку (Shift-F5) и перезапуститься. Во время отладки сценарии блокируются, так что для продолжения редактирования вам следует прекратить отладку.


Получайте удовольствие от отладки с ISE Extensions

- Получить последнее исключение
o   $psISE.CustomMenu.Submenus.Add('Show Exception', {$error[$Error.Count - 1].Exception | fl -f *}, "Ctrl+Shift+E")
- Информация о выборе дампа
o   $psISE.CustomMenu.Submenus.Add('Get-Member', {iex $psISE.CurrentOpenedFile.Editor.SelectedText | gm | ft; iex $psISE.CurrentOpenedFile.Editor.SelectedText | fl -f *; }, "Ctrl+D")
- Переход к определению
o   function GotoDefinition($commandName)
{
    $command = gcm -CommandType Function $commandName
    $file = $command.ScriptBlock.File
    $position = $command.ScriptBlock.StartPosition
    $runspace = $psISE.CurrentOpenedRunspace
    $runspace.OpenedFiles.Add($file)
    ($runspace.OpenedFiles | ?{$_.FullPath -eq $file}).Editor.SetCaretPosition($position.StartLine, $position.StartColumn)
}
$psISE.CustomMenu.Submenus.Add("GotoDefinition", {GotoDefinition $psISE.CurrentOpenedFile.Editor.SelectedText}, "Ctrl+Shift+G")
GotoDefinition не будет работать, пока функции не определены, но вы можете дополнить ее, чтобы она выполняла дополнительную работу.

powershell_debugger

Надеюсь, это вам поможет,

Ибрагим Абдул Рахим (Ibrahim Abdul Rahim) [MSFT]

Перевод: Виктор Горбунков

Posted by abeshkov | 1 Comments

Управление Windows Update из PowerShell

Джеймс О’Нил (James O’Neil) написал, как управлять Windows Update с помощью Windows PowerShell

Вот краткий пример того, что он может делать:

Add-WindowsUpdateAuto     для загрузки обновлений и перезапуска системы, если это необходимо,
Set-WindowsUpdateConfig -n 4 –i     для установки времени проверки обновлений (включая рекомендованные)
Get-WindowsUpdateConfig   для проверки настроек Windows Update

Посмотрите:

http://blogs.technet.com/jamesone/archive/2009/01/27/managing-windows-update-with-powershell.aspx

Надеюсь, это вам поможет,

Джеймс Брандейдж (James Brundage) [MSFT]

Перевод: Виктор Горбунков

Posted by abeshkov | 1 Comments
Filed under:

Управление компонентами (Features) сервера Windows 2008 Server R2 Beta с помощью коммандлетов PowerShell

Если вы уже использовали Windows Server 2008, у вас, возможно, есть опыт в управлении компонентами сервера. Server Manager – Это традиционный способ установки/удаления компонентов сервера. В Windows 2008 Server R2 Beta Windows PowerShell обеспечивает новый подход к управлению компонентами сервера с помощью коммандлетов PowerShell для Server Manager. В этой заметке мы поговорим о том как устанавливать компоненты сервера с помощью этих коммандлетов.

Для использования коммандлетов Server Manager нам требуется импортировать модуль servermanager, выполнив команду PowerShell «Import-Module servermanager». Это необходимо потому, что нужные нам коммандлеты находятся в модуле servermanager, а не являются частью встроенных коммандлетов PowerShell.

 

powershell server manager windows server 2008 r2

На снимке консоли выше мы видим, что модуль servermanager содержит три коммандлета PowerShell. Запустим командлет «Get-WindowsFeature», который выдаст нам список имен компонентов Windows. У нас получится довольно длинный список, поэтому я не буду приводить здесь снимок экрана. Если взять в качестве примера .NET Framework 3.5.1, имя компонента будет «NET-Framework». Мы можем пойти дальше и установить эту функцию. Следует предупредить, что для того, чтобы «Add-WindowsFeature» сработала, следует запустить PowerShell с правами администратора.

powershell add role windows server 2008 r2

Обратите внимание что после выполнения коммандлета «Add-WindowsFeature» в столбце «Display Name» появился знак [X]. Он указывает на то, что компонент добавлен. Чтобы убедиться в этом, всегда можно сверить результаты с тем что показывает графический интерфейс Server Manager. Кстати, эти коммандлеты позволяют управлять не только компонентами, но и ролями сервера. Так, команда «Add-WindowsFeature Web-Server» устанавливает роль Web Server (IIS).

Все просто, верно?

Ксин Ли (Xin Li)

Windows PowerShell Team

Перевод: Виктор Горбунков

Posted by abeshkov | 1 Comments

Остановка любого экземпляра PowerShell.exe (кроме текущего)

Наш архитектор тестирования недавно ввалился ко мне в офис и подбросил вопрос по PowerShell с очень, очень интересным ответом.

Он захотел остановить любой процесс с указанным именем, кроме экземпляра, в котором выполняется сценарий.

Это можно сделать одним хорошим конвейером:


Get-Process Powershell  | Where-Object { $_.ID -ne $pid } | Stop-Process
 

Get-Process получает позиционный параметр (имя), которое является шаблоном, описывающим имя искомого процесса. Он возвращает кучу объектов ProcessInfo, которые имеют свойство, ID (ID процесса). $pid – это переменная, которая сообщает вам ID текущего процесса в PowerShell. Where-Object { $_.ID -ne $pid } просто возвращает каждый экземпляр, который не является текущим. Stop-Process извлекает нужные данные из каждого объекта ProcessInfo и останавливает переданный ему процесс (здесь это любой экземпляр PowerShell, кроме текущего).

Еще один день и еще один вопрос о PowerShell получил свой ответ.

Надеюсь, это вам поможет.

Джеймс Брандейдж (James Brundage) [MSFT]

Перевод: Виктор Горбунков

Posted by abeshkov | 0 Comments

Бесплатная электронная книга по PowerShell

PowerShell MVP и замечательный блоггер специализирующийся на PowerShell Кит Хилл (Keith Hill) собрал заметки из своей популярнейшей серии Effective PowerShell в БЕСПЛАТНУЮ электронную книгу. Ее можно загрузить ЗДЕСЬ.

Смотрите, что вы получите:

Содержание
Введение ...................................................................................................................................................................1
Глава 1: Четыре коммандлета – ключ к информации в PowerShell ..................................................................1
Ключ №1: Get-Command ..........................................................................................................................................1
Ключ №2: Get-Help ...................................................................................................................................................2
Ключ №3: Get-Member ............................................................................................................................................5
Ключ №4: Get-PSDrive ..............................................................................................................................................6
Обновления в PowerShell 2.0.....................................................................................................................................7
Глава 2: Разбираемся с выводом................................................................................................................................8
Вывод – всегда объект .NET....................................................................................................................................8
Вывод функции содержит все, что не перехвачено.................................................................................................9
Другие типы вывода, которые не перехватываются.............................................................................................. 11
Глава 3: Узнайте, какие объекты идут по конвейеру........................................................................................... 12
Глава 4: Вывод множеств - скаляры, коллекции и пустые наборы – о боже! ................................................. 15
Работа со скалярами.............................................................................................................................................. 15
Работа с коллекциями........................................................................................................................................... 16
Работа с пустыми наборами................................................................................................................................. 17
Глава 5: Используй объекты, Люк. Используй объекты! ................................................................................. 19
Глава 6: Узнайте форматирование вывода.......................................................................................................... 22
Глава 7: Режимы разбора PowerShell ................................................................................................................ 31
Глава 8: Параметры связывания конвейера ByPropertyName .......................................................................... 35
Глава 9: Параметры связывания конвейера ByValue ......................................................................................... 38
Глава 10: Регулярные выражения – один из мощных инструментов PowerShell ............................................. 42
Обновления в PowerShell 2.0 ................................................................................................................................. 43
Глава 11: Сравнение массивов................................................................................................................................ 43
Глава 12: Используйте в сценариях Set-PSDebug -Strict - добросовестно.......................................................... 45
Обновления в PowerShell 2.0 .................................................................................................................................. 47
Глава 13: Комментирование строк в файле сценария.......................................................................................... 47
Обновления в PowerShell 2.0 .................................................................................................................................. 48

Экспериментируйте, не скучайте, подключайтесь!

Джеффри Сновер (Jeffrey Snover) [MSFT]
Windows Management Partner Architect
Посетите английский блог команды  Windows PowerShell:    http://blogs.msdn.com/PowerShell
Посетите Windows PowerShell ScriptCenter:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Перевод: Виктор Горбунков

Posted by abeshkov | 0 Comments

Саммит MVP 2009

Вчера начался саммит MVP, а сегодня мы встретились с нашими MVP. Это одно из самых любимых событий года. MVP – это люди сообщества, которые очень активны (и полезны [да – и то, и другое :-)] ). Каждый из них занимается в сообществе определенной технологией. Мы каждый год собираем их вместе и получаем отличный обмен идеями. Мы говорим им, что мы делаем и чего хотим добиться, а они дают нам свои комментарии и отзывы. MVP – это неоценимый источник связи с реальным миром по нашей технологии.

В этом году я действительно поражен, потому что я участвовал организации и выступал во время дискуссии «Состояние PowerShell» вместе с Кеннетом Хансеном (Kenneth Hansen). Кен был председателем, и я был действительно поражен его подходом. Мы с Кеном пришли к выводу, что не знаем, видят ли люди все аспекты «большой картины», и мы пытались понять, как о них говорить. Мы с Кеном в пятницу просматривали слайды презентации, и я подумал, что он сделал отличное дело, представив эти идеи. Это был один из тех разговоров «за сценой», в которых мы обсуждали, что представляет собой проблема, как мы будем подходить к ней, где мы находимся и куда направляемся. К счастью, это было общение после которого люди расходятся, говоря «ТЕПЕРЬ я понимаю, зачем ты это делал».

MVP великолепны, поскольку они всегда скажут вам, если вы делаете что то непонятное или очевидное. Честное зеркало трудно найти, и оно исключительно ценно. Мы сегодня обнаружили, что проговорили до 9.

Экспериментируйте, не скучайте, подключайтесь!

Джеффри Сновер (Jeffrey Snover) [MSFT]
Windows Management Partner Architect
Посетите английский блог команды  Windows PowerShell:    http://blogs.msdn.com/PowerShell
Посетите Windows PowerShell ScriptCenter:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Перевод: Виктор Горбунков

Posted by abeshkov | 0 Comments

Фолксономия PowerShell – вы в теме?

Недавно я провел несколько экспериментов с фолксономией PowerShell. Идея состояла в том, чтобы пометить содержимое Интернета (блоги, комментарии, ответы в группах новостей и т.д.) уникальными тегами, которые могли бы воспринимать поисковые машины, чтобы облегчить извлечение необходимой информации.

Эти усилия были результатом битвы связанной с созданием документации. Особенно ожесточенно мы вели борьбу за использование термина коммандлет. Коммандлет - это слово, который я создал, чтобы описывать команды PowerShell. Я хотел показать, что это такие маленькие штучки, которые соединяются с другими маленькими штучками для решения больших проблем. Одной из причин, по которым я был предан идее «маленьких» коммандлетов, было то, что я знал, что группа разработки сопротивлялась «налогу» на написание слова «комманды». Я хотел быть в состоянии начать целую дискуссию с исходным условием, что мы просим их проделать совсем немного добавочной работы.

Позвольте, я поправлю запись об этом. Джим Трухер (Jim Truher)напомнил мне, чтов начале я пытался протоклнуть термин «Функциональный элемент» (Functional Unit, FU) [надеюсь вы поняли мою хитрость?] и что на самом деле термин «коммандлет» придумал он, а не я. Попытка внедрить «FU» напомнила мне о замечательной истории Дейва Катлера (Dave Cutler), которую я как-то слышал. Не ждите – я не расскажу ТУ историю в блоге – никогда, просто не обращайте на нее внимания.

Перспектива документирования была такой, что мы не должны изобретать новые слова, ведь имеется отличный устоявшийся термин («команда»). Мы рассмотрели ситуацию с разных сторон, решающим аргументом стало то, что происходит после ввода предполагаемых ключевых слов в поисковые машины.

Слово для поиска

Live Search

Google

Команда

102,000,000

200,000,000

Коммандлет

29,600

107,000

Соотношение

3446x

1869x

Используя термин «коммандлет», мы повышаем соотношение сигнал-шум для поисковых машин и обеспечиваем нашим потребителям гораздо более полезный результат.

Я начал думать об этом и мне стало любопытно, нельзя ли еще более улучшить ситуацию, введя уникальный тег PSMDTAG  (PowerShell MetaData TAG) и соглашение по его использованию так, чтобы люди могли использовать этот тег, чтобы более точно находить требуемое.

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

Давайте начнем с простого – зайдите в свой любимый поисковик, наберите PSMDTAG:FAQ  и посмотрите на результаты поиска. Вы найдете не слишком много, поскольку я занимаюсь этим не так давно. Заметьте, что результаты поиска выдают вам большинство типичных часто встречающихся вопросов FAQ. Затем попробуйте что-нибудь вроде:

psmdtag:faq prompt
psmdtag:faq delegate
psmdtag:faq wmi method
psmdtag:faq base64

Скажу еще раз – вы не сойдете с ума от изобилия, поскольку я пока расставил не слишком много тегов. Вопросы, которые я хочу задать:

  1. Полезно ли это?
  2. Достаточно или это полезно для вас, чтобы вы начали помечать тегом свои материалы или добавлять теги в комментарии к материалам других людей?
    1. Посмотрите на ЭТО. Я использую комментарии для пометки тегами чужих материалов.

PSMDTAG:FAQ Что такое PSMDTAG?
PSMDTAG:FAQ  Будет ли PowerShell иметь собственную фолксономию?

Экспериментируйте, не скучайте, подключайтесь!

Джеффри Сновер (Jeffrey Snover) [MSFT]
Windows Management Partner Architect
Посетите английский блог команды  Windows PowerShell:    http://blogs.msdn.com/PowerShell
Посетите Windows PowerShell ScriptCenter:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Перевод: Виктор Горбунков

Posted by abeshkov | 0 Comments

Откуда это взялось?

Доводилось ли вам раньше задавать себе вопрос: «откуда ЭТО взялось?»

В PowerShell мы постарались дать вам механизм, который можно использовать для ответов на подобные вопросы. Мы потратили для этого дополнительные ресурсы (память, циклы ЦПУ и т.д.), для нас важнее производительность ЛЮДЕЙ, использующих наши программы, а не на производительность кода. Когда что-то принимает неправильную форму, важно, как быстро человек может понять, что происходит и исправить положение.

Раньше мы немного говорили об этом, но лишь в контексте обширной информации об ошибках, которую мы собираем. Но в этом блоге я хочу обсудить другую функцию V1, а затем рассказать вам о ДРУГОМ любимом мною V2-изме.

Вы знаете, что переменные выступают в качестве устройства и с ними можно делать такие вещи:

PS> dir Variable:s* 
Name                           Value 
----                           ----- 
ShellId                        Microsoft.PowerShell

А так вы пробовали?

PS> dir Variable:s* |ft Name,Description -auto 
Name       Description 
----       ----------- 
ShellId    The ShellID identifies the current shell.  This is used by #Requires. 
StackTrace

Вы об этом знали? Переменные содержат гораздо больше сведений, чем может увидеть невооруженный глаз! Вы можете задать описание переменной, используя команду Set-Variable 


PS> Set-Variable X 15 -Description "This is a test" 
PS> Get-Variable x |fl * 
Name        : x 
Description : This is a test 
Value       : 15 
Visibility  : Public 
Module      : 
ModuleName  : 
Options     : None 
Attributes  : {}

Это работало, начиная с PowerShell V1, но тогда мы были не в состоянии ответить на вопрос – откуда взялась эта функция?

Каждый раз когда я начинаю работать с PowerShell, первым делом с поvощью механизма dotsourcing я подключаю множество сценариев, которые определяют функции. Иногда я решал, что одна из постоянно используемых функций, нуждается в улучшении и должна работать иначе. Возникал вопрос, в каком файле была описана эта функция? Нормального способа ответить на этот вопрос не было. В PowerShell V2 все изменилось.

В V2 мы расширили объект SCRIPTBLOCK добавив в него параметр FILE, благодаря которому можно посмотреть в каком файле была объявлена функция.  Для получения всей информации о Scriptblock, необходимо использовать флаг -FORCE в командах форматирования.

 


[4376:0]PS> (dir function:prompt ).scriptblock |fl * 
    if ($PSDebugContext) 
    { "DBG>" 
    } 
    else 
    { 
        "[{0}:{1}]PS> " -f $PID, $NestedPromptLevel 
    } 
[4376:0]PS> (dir function:prompt ).scriptblock |fl * -force 
IsFilter      : False 
StartPosition : System.Management.Automation.PSToken 
File          : D:\ps\profile.ps1 
Attributes    : {} 
Module        :

Теперь мы получили все что нам нужно, и можем обращаться к этим сведениям напрямую:

 


[4376:0]PS> (dir function:prompt ).scriptblock.file 
D:\ps\profile.ps1

PSMDTAG:FAQ: Как узнать, где определена функция?
(dir function:X).ScriptBlock.File

Экспериментируйте, не скучайте, подключайтесь!

Джеффри Сновер (Jeffrey Snover) [MSFT]
Windows Management Partner Architect
Посетите английский блог команды  Windows PowerShell:    http://blogs.msdn.com/PowerShell
Посетите Windows PowerShell ScriptCenter:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Перевод: Виктор Горбунков

Posted by abeshkov | 0 Comments

Преобразование в массив

При запуске конвейера PowerShell этот конвейер может вернуть 0, 1 или несколько элементов. Если вы присваиваете результат конвейера переменной, вы получите $null, один элемент или массив элементов, соответственно. Часще всего вы не обращаете внимание на то какие типы возвращаются, но иногда вы предпочли бы принудительно приводить результат, чтобы он всегда представлял собой массив. В этих случаях вы можете использовать @( ... ). Например:

$a = @(get-childitem)

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

Это обычно работает достаточно хорошо, но я обнаружил, что я обычно решаю, что мне нужен массив, уже глубоко закопавшись в написание конвейера. После этого мне приходится сдвигать курсор к началу конвейера, чтобы вставить «@(». Несколько раз повторив эту операцию, я устал и решил, что лучше буду добавлять в конец конвейера что-нибудь, что преобразует результаты в массив. Так родилась моя функция ToArray.

 


function ToArray
{
  begin
  {
    $output = @(); 
  }
  process
  {
    $output += $_; 
  }
  end
  {
    return ,$output; 
  }
}

Достаточно просто, да? Начальный блок создает новый пустой массив. Блок обработки, который вызывается для каждого элемента конвейера, добавляет элемент к массиву, а конечный блок просто помещает этот массив в массив длиной 1 и записывает его в конвейер. Мне приходится помещать массив $output в массив из 1-го элемента, поскольку конвейер раскрывает все перечисления (ну ладно, почти все). Этот способ просто раскрывает массив из 1-го элемента и находит, что осталось в моем исходном массиве.

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

Для меня это срабатывает. Это несложно и упрощает мне жизнь. Теперь если мне нужно создать массив результатов, я просто передаю их в ToArray. Мне больше не нужно возвращаться в начало конвейера. :-)

 

$a = get-childitem | ToArray

- Марсель Ортиц Сото (Marcel Ortiz Soto) [MSFT]

P.S. Если вам кажется, что ToArray – это слишком длинно, создайте сокращение.

Перевод: Виктор Горбунков

Posted by abeshkov | 0 Comments

Разговор на JAOO

В прошлом году я был рад выступить на конференции JAOO. Это отличная конференция по языкам программирования. Я был рад обнаружить, что хотя у меня был доклад по технологиям Microsoft (AndersH дал мне один из ключевых докладов), большинство людей и докладов не имели отношения к Microsoft. Это позволило мне побеседовать на самые разные темы. Дало возможность вернуться к основам и объяснить, что мы делаем и как мы это делаем, людям, которым не обязательно имели хотя бы базовую подготовку и которые потенциально не особенно дружественно настроены по отношению к Microsoft. (У меня есть веселая история по этому поводу – спросите меня как-нибудь лично и я расскажу.)

Надеюсь, вы получите удовольствие от ЭТОГО выступления.

Экспериментируйте, не скучайте, подключайтесь!

Джеффри Сновер (Jeffrey Snover) [MSFT]
Windows Management Partner Architect
Посетите английский блог команды  Windows PowerShell:    http://blogs.msdn.com/PowerShell
Посетите Windows PowerShell ScriptCenter:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Перевод: Виктор Горбунков

Posted by abeshkov | 0 Comments
Filed under:

Разница между версиями Windows PowerShell

MVP по PowerShell Ойсин Грехан (Oisín Grehan) сделал действительно большую работу, описав то чем отличаются друг от друга разные выпуски PowerShell.

V1 и CTP3 http://www.nivot.org/2009/02/04/DifferencesBetweenPowerShell10RTMAndPowershell20CTP3Win7Beta.aspx

CTP2 и CTP3 http://www.nivot.org/2008/12/23/PowerShell20CTP3HasArrived.aspx

Ойсин, большое спасибо!.

Осама Саджид (Osama Sajid) [MSFT]

Перевод: Виктор Горбунков

Posted by abeshkov | 0 Comments
Filed under:

Rename-Drive : Переименование устройств с помощью PowerShell и WMI

Шейн Бартон (Shane Burton) из Compellent попросил меня помочь ему с переименованием устройства в PowerShell. Для переименования устройства можно использовать разные классы WMI, Win32_Volume, и Win32_LogicalDisk. Устройство изменяется путем выбора имени свойства объекта WMI (Label в Win32_Volume и VolumeName в Win32_LogicalDisk) с последующим возвращением его в репозиторий WMI с помощью метода Put(). @", @" WMI и PowerShell вместе позволяют сделать множество отличных штук. Если вы хотите быстро найти, что можно сделать с помощью WMI в PowerShell, просмотрите мою раннюю заметку: Get-WmiHelp / Search-WMIHelp.

Вот моя функция Rename-Drive:

Rename-Drive

Краткое описание:

Переименовывает устройство с помощью WMI

Синтаксис:

Rename-Drive [[-deviceID] [<Object>]] [[-name] [<Object>]] [<CommonParameters>]

Подробное описание:

Использует класс Win32_LogicalDisk для переименования устройства с помощью WMI. Должна запускаться с правами администратора

Примеры:

-------------------------- Пример 1 --------------------------

# Sets the name of C: to FooBar
Rename-Drive C: FooBar

    
    -------------------------- Пример 2 --------------------------

# Resets the name of C:
Rename-Drive C:

 

Текст функции Rename-Drive:

function Rename-Drive {
              
    #.Synopsis
    #    Renames a drive with WMI
    #.Description 
    #    Uses the Win32_LogicalDisk class to rename a drive using WMI.  Must be running as administrator to use    
    #.Example    
    #    # Sets the name of C: to FooBar
    #    Rename-Drive C: FooBar
    #.Example
    #    # Resets the name of C:
    #    Rename-Drive C:     
    param($deviceID = "C:", $name)
$drive = Get-WmiObject "Win32_LogicalDisk WHERE DeviceID='$deviceID'"
    if (-not $drive) { return }                      
    $drive.VolumeName = $name
    $null = $drive.Put()

}

Надеюсь, это вам поможет,

Джеймс Брандейдж (James Brundage) [MSFT]

Перевод: Виктор Горбунков

Posted by abeshkov | 0 Comments
Filed under:
More Posts Next page »
 
Page view tracker