Быстрые клавиши командной строки и Powershell

Может конечно написаное ниже для кого-то секретом не является, но я это обнаружил чисто случайно. Прогоняя попугая с клавиатуры случайно нажал F7, активным окном была командная строка. К моему удивлению отобразилась история команд. Выглядит это так:

Быстрый поиск привел на сайт http://technet.microsoft.com/en-us/library/ee176868.aspx, который говорит о том, что эта и некоторые другие быстрые клавиши также работают и в консоли powershell.

Создание коллекций SCCM 2007 при помощи скрипта на powershell

Как известно для установки программ нужна коллекция, на которую advetersement и будет назначен. Причем жедательно эту коллекцию создавать, чтоб в нее попали только те компьютеры, на которых программа не установлена. Собственно мне надоело каждый раз делать одно и тоже, в результате чего родился скрипт. Скрипту в качестве параметров передается название программы, строка для отбора и если необходимо родительская коллекция, в которой необходимо создвать коллекцию. В результате создаются 2 коллекции – одна будет содержать компьютреы, на которых требуемая программа установлена, вторая на которых не установлена. Коллекции будут обновляться раз в сутки и автоматически создается Query based правило для автоматического заполнения коллекции.

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

$Site = “site name”
$sccmServer = “sccmserver name”

function Create-SCCMCollection($parentCollectionName, $collectionName)
{
$ColClass = [WMIClass]”\\$sccmServer\Root\SMS\Site_$($Site):SMS_Collection”
$shClass = [WMIClass]”\\$sccmServer\Root\SMS\Site_$($Site):SMS_ST_RecurInterval”
$Col = $ColClass.PSBase.CreateInstance()
$Col.Name = $collectionName
$Col.OwnedByThisSite = $True
$Col.Comment = “Collection $collectionName”
$col.RefreshType = 2
$sh = $shClass.PSBase.CreateInstance();
$sh.dayspan = 1
$col.RefreshSchedule = $sh
$Col.psbase
$Col.psbase.Put()
$parentColID = (get-wmiobject -class “SMS_Collection” -namespace “root\sms\site_$($Site)” -computername “solsms” -filter “Name = ‘$parentCollectionName'”).collectionID
$NewCollectionID = (Get-WmiObject -computerName $sccmServer -namespace Root\SMS\Site_$Site -class SMS_Collection | where {$_.Name -eq $collectionName}).CollectionID $RelClass = [WMIClass]”\\$sccmServer\Root\SMS\Site_$($Site):SMS_CollectToSubCollect”
$Rel = $RelClass.PSBase.CreateInstance()
$Rel.ParentCollectionID = $parentColID
$Rel.SubCollectionID = $NewCollectionID
$Rel.psbase
$Rel.psbase.Put()

}

function AddQueryToCollection($collectionName, $query)
{
$host.UI.RawUI.ForegroundColor = “White”
$Method = “AddMembershipRule”
$colClass = get-wmiobject -class “SMS_Collection” -namespace “root\sms\site_$($Site)” -computername $sccmServer -filter “Name = ‘$collectionName'”
$objColRuleDirect = [WmiClass]”\\$sccmServer\root\sms\site_A01:SMS_CollectionRuleQuery”
$objColRuleDirect.psbase.Properties[“LimitToCollectionID”].value = “”
$objColRuleDirect.psbase.Properties[“QueryExpression”].value = $query
$objColRuleDirect.psbase.Properties[“RuleName”].value = “Auto Query Rule” $InParams = $colClass.psbase.GetMethodParameters($Method)
$InParams.collectionRule = $objColRuleDirect
$param = $objColRuleDirect.psbase.getMethodParameters(“ValidateQuery”)
$param.wqlquery = $query
$R = $objColRuleDirect.psbase.invokeMethod(“ValidateQuery”,$param,$null)
if ($R.ReturnValue -eq $True) {
$R = $colClass.psbase.InvokeMethod($Method, $inParams, $Null)
if ($R.ReturnValue -eq 0) {
write-Host “Query sucssesful added” $curObj.ResourceID
}
}
else {
$host.UI.RawUI.ForegroundColor = “Red”
write-Host “Error in query ” $query
$host.UI.RawUI.ForegroundColor = “White”
}
}
If ($args.length -eq 0) {
write-host “Please use command Softname SoftQuery Parent Collection Name”
exit
} $softname = $args[0]
$softquery = $args[1]
$parentcollection = $args[2]
If ($parentcollection.length -eq $null) {
write-host “Use default collections”
Create-SCCMCollection “Corporate Software Collections” $softname” Installed”
Create-SCCMCollection “Corporate Software Installation” $softname” Not Installed”
}
else{
write-host “Use custom collections”
Create-SCCMCollection $parentcollection $softname” Installed”
Create-SCCMCollection $parentcollection $softname” Not Installed”
}

$soft = $softquery
$selectFull = “SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name, SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup, SMS_R_SYSTEM.Client”
$selectShort = “SMS_R_System.ResourceID”
$queryPresentSoft = “select ” + $selectFull + ” from SMS_R_System inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName like ‘” + $soft + “‘ and Active = 1 and Obsolete = 0”;
$querycontain = “select ” + $selectShort + ” from SMS_R_System inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName like ‘” + $soft + “‘ and Active = 1 and Obsolete = 0”;
$queryNotPresentSoft = “select ” + $selectFull+” from SMS_R_System where ResourceId not in (“+$querycontain+”) and Active = 1 and Obsolete = 0″

AddQueryToCollection $softname” Installed” $queryPresentSoft
AddQueryToCollection $softname” Not Installed” $queryNotPresentSoft
$host.UI.RawUI.ForegroundColor = “Green”

Создание собственного загрузочного диска на базе Windows PE

С выходом Windows 7 вышел и новый WAIK. В целом работа с ним особо не отличается от работы с WAIK для Windows Vista, однако в нем наконец-то появилась поддержка русского языка. А это означает что можно беспроблемно его использовать для например сохранения данных с нерабочено ноутбука/компьютера.
Получить его можно здесь – http://www.microsoft.com/downloads/details.aspx?familyid=696DD665-9F76-4177-A811-39C26D3B3B34&displaylang=en. Хотелось бы отметить, что в отличие от предыдущей версии для скачивания данного WAIK не нужно проходить проверку подлинности Windows. Странно, но это так. Скачиваем, пишем на болванку, устанавливаем. И затем запускаем Deployment Tools Command Prompt (запустить необходимо с правами администратора).
А дальше все очень просто:
d:\Data\OsDeployImages\boot\work\image – директория для работы,правится по надобности.
copype.cmd x86 d:\Data\OsDeployImages\boot\work\image\
Директория image не должна существовать и будет создана.
В отличие от предыдущего WAIK тут практически все делается одной командой – dism
Монтируем образ:
dism /mount-wim /wimfile:d:\data\osdeployimages\boot\work\image\boot.wim /index:1 /mountdir:d:\Data\OsDeployImages\boot\work\image\mount

Добавляем поддержку русского языка:

dism /image:d:\Data\OsDeployImages\boot\work\image\mount /add-package /packagepath:e:\WinPE_LangPacks\x86\ru-ru\lp.cab

Диск E это DVD с WAIK.
Устанавливаем русский язык языком по умолчанию:

dism /image:d:\Data\OsDeployImages\boot\ork\image\mount\ /set-allintl:ru-ru

Учитывая что я обычно гружусь по сети, то необходимо интегрировать в образ все необходимые драйвера сетевых карт для поддержки любого имеющегося у меня оборудования. Сложил я все драйвера в директорию D:\Data\OsDeployImages\boot\drivers, где для каждой железяки создана отдельная директория с драйверами для нее. И тут меня ждал сюрприз – теперь inf файл нужно указывать конкретно, указание путь\*.inf как было раньше уже не работает. Ручками перепысывать было лень и появился такой маленький скрипт для powershell:

Get-ChildItem D:\Data\OsDeployImages\boot\drivers -recurse | where {$_.extension -eq “.inf” } | select fullname | foreach-object { echo “Dism /image:d:\Data\OsDeployImages\boot\work\image\mount /Add-Driver /Driver:”$_.fullname} | out-file d:\list.txt -encoding ascii

После его работы получаем список вида:

Dism /image:d:\Data\OsDeployImages\boot\work\image\mount /Add-Driver /Driver:D:\Data\OsDeployImages\boot\drivers\2510p\e1000325.inf
Dism /image:d:\Data\OsDeployImages\boot\work\image\mount /Add-Driver /Driver:D:\Data\OsDeployImages\boot\drivers\2510p\E1E5132.INF
Dism /image:d:\Data\OsDeployImages\boot\work\image\mount /Add-Driver /Driver:D:\Data\OsDeployImages\boot\drivers\2510p\E1e6032.inf
Dism /image:d:\Data\OsDeployImages\boot\work\image\mount /Add-Driver /Driver:D:\Data\OsDeployImages\boot\drivers\2510p\e1g6032.inf
Dism /image:d:\Data\OsDeployImages\boot\work\image\mount /Add-Driver /Driver:D:\Data\OsDeployImages\boot\drivers\2510p\e1q5132.inf
Dism /image:d:\Data\OsDeployImages\boot\work\image\mount /Add-Driver /Driver:D:\Data\OsDeployImages\boot\drivers\2510p\e1q6032.inf
Dism /image:d:\Data\OsDeployImages\boot\work\image\mount /Add-Driver /Driver:D:\Data\OsDeployImages\boot\drivers\2510p\PRO1000\DOS\oemsetup.inf
Dism /image:d:\Data\OsDeployImages\boot\work\image\mount /Add-Driver /Driver:D:\Data\OsDeployImages\boot\drivers\2510p\PRO1000\Win32\e1000325.inf
Dism /image:d:\Data\OsDeployImages\boot\work\image\mount /Add-Driver /Driver:D:\Data\OsDeployImages\boot\drivers\2510p\PRO1000\Win32\E1E5132.INF

который просто исполняем.

Далее добавляем нужные программы:

Создаем директорию d:\Data\OsDeployImages\boot\work\image\mount\Tools и в нее добавляем все, что нам нужно. Для снятия образов нужно не забыть скопировать на него утилиту imagex.
Если необходимо запускать какую-то программу после загрузки, то добавляем ее в файлик d:\Data\OsDeployImages\boot\work\image\mount\Windows\System32\Startnet.cmd Вообще-то для этого существует файл Winpeshl.ini, но вот я после загрузки запускаю Far Manager. Если его запуск прописать в Winpeshl.ini то startnet.cmd почему-то не отрабатывает. Почему не знаю, у меня работало именно таким образом.
После чего командой
dism /unmount-Wim /MountDir:d:\Data\OsDeployImages\boot\work\image\mount /Commit
отмонтируем образ boot.wim и на этом этап создания образа окончен. Добавляем его например как boot image в WDS сервер и получаем возможность загрузить по сети любой компьютер.
Если нужна загрузка с DVD, то все достаточно просто:

Монтируем образ:

dism /mount-wim /wimfile:d:\Data\OsDeployImages\boot\work\image\boot.wim /index:1 /mountdir:d:\Data\OsDeployImages\boot\work\image\mount

и создаем загрузочное меню:

Bcdedit /createstore d:\Data\OsDeployImages\boot\work\image\mount\boot\BCD
Bcdedit /store d:\Data\OsDeployImages\boot\work\image\mount\boot\BCD -create {bootmgr} /d “Boot Manager”
Bcdedit /store d:\Data\OsDeployImages\boot\work\image\mount\boot\BCD -set {bootmgr} device boot
Bcdedit /store d:\Data\OsDeployImages\boot\work\image\mount\boot\BCD -create /d “WINPE” -application osloader
После данной команды будет выдан ID, который необходимо запомнить. {668f076f-a44f-11de-aab5-002264ad89b9}
Bcdedit /store d:\Data\OsDeployImages\boot\work\image\mount\boot\BCD -set {668f076f-a44f-11de-aab5-002264ad89b9} osdevice boot
Bcdedit /store d:\Data\OsDeployImages\boot\work\image\mount\boot\BCD -set {668f076f-a44f-11de-aab5-002264ad89b9} device boot
Bcdedit /store d:\Data\OsDeployImages\boot\work\image\mount\boot\BCD -set {668f076f-a44f-11de-aab5-002264ad89b9} path \windows\system32\winload.exe
Bcdedit /store d:\Data\OsDeployImages\boot\work\image\mount\boot\BCD -set {668f076f-a44f-11de-aab5-002264ad89b9} systemroot \windows
Bcdedit /store d:\Data\OsDeployImages\boot\work\image\mount\boot\BCD -set {668f076f-a44f-11de-aab5-002264ad89b9} winpe yes
Bcdedit /store d:\Data\OsDeployImages\boot\work\image\mount\boot\BCD -displayorder {668f076f-a44f-11de-aab5-002264ad89b9} -addlast
oscdimg -n -m -o -bd:\Data\OsDeployImages\boot\work\image\etfsboot.com d:\Data\OsDeployImages\boot\work\image\mount d:\Data\OsDeployImages\boot\winpe_x86.iso

Все, загрузочный iso образ готов. Если boot.wim не нужен, то его можно отмонтировать.