среда, 14 ноября 2018 г.

Windows Deployment с WAIK и WDS - XP/Vista/Win7

Перед вами набор совершенно неоформленных заметок на тему автоматизированного распространения Windows по сети.
На самом деле мне не не нужно было бы в таком виде их публиковать, но хочется, чтобы они не пропали. Беспорядочность изложения объясняется и извиняется тем, что заметки сделаны для собственного употребления.

Речь пойдет о Windows XP/Vista/7.
Инструменты: WAIK и WDS.
Кроме них существуют MDT и SCCM, но о них не здесь.

Главное преимущество способа по сравнению с конкурентами - его бесплатность. Интересно, что можно комбинировать элементы фирменного подхода и платных вариантов.

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

Предварительный результат - система работает, но есть проблемы с драйверами. Все четко работает только на виртуальных машинах Microsoft. Это и понятно - виртуальные машины производства фирмы Мелкософт, драйверы стандартные и проблем с ними принципиально не возникает. В случае физических компьютеров существуют проблемы PXE загрузки по сети образа операционной системы. Могут быть проблемы с определением диска, хотя и реже.
Да, eсть способы наполнения boot-имиджа драйверами, но процесс довольно трудоемкий и неудобный даже для создания имиджа к определенному типу железа. Что уж говорить о создании универсального образа. По этой причине я собираюсь протестировать альтернативные варианты (Symantec, Acronis), а также возможность их сочетания с классическим Мелкософтовским.

Итак, к делу!
=======================
Маунтим образ нужного Windows к папке mount при помощи imagex или Dism.

Добавляем драйвер командой
Dism /image:\winpe\mount /add-driver:"PATH"
Path должен указывать "внутрь" фолдера с драйверами, содержащего файлы .inf и .sys.

Добавляем setup packages:
Winpe-setup.cab
Winpe-setup-client.cab

Создаем файл winpeshl.ini
Переносим с оригинального диска файл Lang.ini во избежание ошибки.
Для создания ISO-образа воспользуемся командой oscdimg---.
В случае создания загрузочного USB диска этот этап пропускается.

Boot-Image Win7 32-bit - определяет как клиентские, так и серверные системы. Возможно, серверные из-за своей новизны, а клиентские из-за 32-битовости. Хотя есть инфа, что серверные boot-images дают больше возможностей. Стоит попробовать образ Server 2008 не R2.

Проверяем Answer file, создаваемый программой sysprep.

Vista boot image setup не реагирует на мышку, а Win7 - таки да.
Итак, лучший boot-image - Win7 discovery!

Boot Setup 7 дал ошибку при работе с Vista install image, но, возможно, проблема... OK, проблема таки в испорченном имидже, или же в том, что он не прошел sysprep.

Unattended file assigned from image properties is not work. Попробовать создать его из Vista при помощи Vista WAIK и не забыть применить его к Vista image из Vista boot image.
Стоит добавить domain user в файл wdsclientunattend.xml для успешного присоединения пользователя к домену.

Во время установки можно открыть лог-файлы setupacc.txt и setuperr.txt из папки X:\Windows\Panther. Для этого нажимаем SHIFT+F10 и получаем cmd.

SHIFT+CTRL+F3 - включение режима oobe во время установки Windows. Делается при появлении запроса ввести user name и password.

Обновить WAIK до SP1.

Как создать и распространить XP image при помощи WDS.

Сначала захватываем образ XP (на виртуальной машине это заняло у меня 7 минут).
После внедрения образа в WDS и проверки его успешного распространения, делаем sysprep XP и захватываем образ снова.
Теперь он пригоден не только в качестве бэкапа определенного компьютера, его можно "сажать" на любое железо, что и требовалось доказать.

Команда захвата образа XP:
Imagex /capture C: c:\MyXpImages "XP_SP2_backup_virtual"

Imagex - команда, умеющая захватывать, маунтить и применять образы.
/capture - параметр, указывающий на необходимость захвата образа.
C: - имя захватываемого логического диска.
c:\MyXpImages - название файла образа, создаваемого после захвата.
"XP_SP2..." - вы удивитесь, но в одном файле могут существовать несколько образов и каждый со своим названием.

Deployment - вопросы.

Как грамотно создать файл ответов для Vista/7?
Как присоединить файл ответов к имиджу?
Как можно использовать capture/discover/install images для создания загрузочного диска или ISO имиджа?
Как BOOT.WIM преобразуется в CD?

Сделать сейчас:
Переписать образ XP
Присоединить его к WDS.
Поднять с него виртуальный компьютер (с какого имиджа будет загрузка).
Затем, при помощи виртуальной Vista с установленным WAIK 6, создать файл ответов и поднять с ним XP.

Разобраться в разных типах имиджей - capture, install и discover, провести опыты. Разобраться с gImageX.

По ощущению, discover и boot имиджи не отличаются. Boot используется для сетевой загрузки. По идее discover используется для создания реального загрузочного CD в случаях, когда функция PXE не работает. Если вспомнить, WinPE не загружает setup или minisetup, а используется для ImageX.

Разобраться с SIM.

Что такое режим аудита?

Очень рекомендуется использовать BOOT.WIM от Server 2008 DVD, т.к. он дает возможность использовать полную функциональность WDS.

В дальнейшем нужно разобраться с добавлением драйверов и программ в имидж.

DISM - Deployment Image Servicing and Management tool

C:\winpe_x86>dism.exe /?

DISM.exe [dism_options] {WIM_command} []
DISM.exe {/Image: | /Online} [dism_options]
{servicing_command} []

DESCRIPTION:

DISM enumerates, installs, uninstalls, configures, and updates features
and packages in Windows images. The commands that are available depend
on the image being serviced and whether the image is offline or running.

IMAGE SPECIFICATIONS:

/Online - Targets the running operating system.
/Image - Specifies the path to the root directory of an
offline Windows image.

DISM OPTIONS:

/English - Displays command line output in English.
/Format - Specifies the report output format.
/WinDir - Specifies the path to the Windows directory.
/SysDriveDir - Specifies the path to the system-loader file named
BootMgr.
/LogPath - Specifies the logfile path.
/LogLevel - Specifies the output level shown in the log (1-4).
/NoRestart - Suppresses automatic reboots and reboot prompts.
/Quiet - Suppresses all output except for error messages.
/ScratchDir - Specifies the path to a scratch directory.

For more information about these DISM options and their arguments, specify an
option immediately before /?.

Examples:
DISM.exe /Mount-Wim /?
DISM.exe /ScratchDir /?
DISM.exe /Image:C:\test\offline /?
DISM.exe /Online /?

Создание загрузочного носителя

Copype x86 C:\WinPE_x86
Copy x:\xxx.wim C:\WinPE_x86\ISO\sources\boot.wim
(setup, capture, discovery).
Oscdimg -bc:\WinPE_x86\etfsboot.com C:\WinPE_x86\ISO C:\WinPE_x86\Image.iso

Эти команды можно ввести в batch-файл. Но при одном условии - запускать файл можно будет из "Deployment Tools Command Prompt" командой call. Например, если batch-файл называется MakeISO.bat, то команда его запуска будет выглядеть так: call MakeISO.bat.

Можно сделать экспорт разных WIM boot-образов в некоторую папку и затем массовое создание загрузочных ISO-файлов.
Создание WinPE.ISO,
создание файла ответов,
sysprep,
capture,
Изменения и добавки,
deploy (apply) image individually or with WDS включая файл ответов.

Я не нашел одной определенной статьи или учебника, которые бы кратко и понятно показали всю картину Windows Deployment, объяснили, какие шаги нужно сделать и для чего предназначена каждая утилита, а также пошагово и с иллюстрациями показали все этапы большого пути, учитывая всевозможные проблемы и подводные камни. Пришлось взяться за это самому, собрав информацию из разных источников и опробовав все на практике. Наш завет: правду, одну только правду и ничего, кроме правды.

Windows Deployment:
WDS - осуществляет реальный deployment.
WDS устанавливается на серверных системах Window Server 2008/R2.
WAIK - custom installation, image capturing and applying.
WAIK существует для операционных систем, начиная с Vista.
В случае, когда не нужно изменять оригинальный образ, можно воспользоваться готовыми WIM образами с диска Vista или Win7 и распространять их при помощи WDS. Это довольно несложная операция.
Если же нужно создать образ определенной конфигурации с заранее установленными программами, то после инсталляции и настройки Windows нужно будет воспользоваться набором инструментов WAIK. WAIK умеет снимать образы с готовых систем и применять их к новым. Это аналогично тому, что делают программы Ghost, Acronis, Paragon. Основной инструмент, ответственный за снятие и применение образов - ImageX. Кроме того, при помощи WAIK можно создать файл ответов с различными настройками, например, с указанием Product Key. В дополнение к этому WAIK способен внедрять хот-фиксы, драйверы и программы в качестве пост-инсталляционных задач. Т.е., если нужно иметь компьютер с установленным Office, это можно сделать одним из двух способов: инсталлировать Office и затем снять образ или создать пост-инсталляционную задачу.

Не все, что было сказано в отношении образов, относится к WinXP, т.к. на оригинальном диске он существует не как образ, а в виде набора файлов. При желании сделать автоматизированный deployment XP, нужно его сначала проинсталлировать на компьютер, а затем захватить образ. Получившийся образ уже пригоден для централизованного распространения при помощи WDS.

На дисках Vista и Win7 кроме образа INSTALL.WIM существует образ BOOT.WIM, необходимый для загрузки инсталляционного окружения. Его можно использовать как для загрузки по сети, так и для создания загрузочного диска WindowsPE. В обоих случаях результат одинаков. Интересно, что на практике можно смешивать разные загрузочный и инсталляционный образы. Т.е., при помощи загрузочного образа Vista можно установить как Vista, так и Win7 или же наоборот.
WindowsPE используется тогда, когда сетевая карта компьютера не поддерживает стандарт PXE, необходимый для загрузки по сети.
Кроме того WindowsPE можно использовать для решения компьютерных проблем, в частности, когда компьютер не способен загрузиться самостоятельно.

Интересная возможность - подготовка к захвату образа при помощи виртуального компьютера. Во-первых экономится компьютер, во-вторых упрощается установка драйверов (их роль выполняют integration services в Hyper-V), в-третьих перезагрузки проходят быстрее, в-четвертых все операции можно производить удаленно.
Единственное но, перед захватом образа с подготовленного компьютера нужно не забыть удалить Integration Services.

=Понятия=
WDS (Windows Deployment Services) - server role for deployment Windows WIM images.
WAIK (Windows Automated Installation Kit) - application for image modifying and creating answer files with Windows SIM
Windows SIM (Windows System Image Manager) - tool for creating answer file.
Answer file - file with answers for installation questions, for example - Product key.
Если возникает ошибка при попытке создания файла каталога, можно воспользоваться файлом с инсталляционного диска.
WinPE - bootable disk with ImageX and other tools.
ImageX - capture (create image), mount/unmount drives, commit and apply (restore image). It is main part of WAIK and run typically from WinPE.
Dism - Инструмент для работы с образом.
Capture image - загрузочный образ, модифицированный для загрузки утилиты захвата, вместо setup. Результат работы утилиты - install image, который можно добавить в WDS.
Discover image - загрузочный образ, использующийся для начала установки.
Sysprep - clear hardware dependinces and SID.
BDD (Business Desktop Deployment).
MDOP (Microsoft Desktop Optimisation Pack).

Если взять нетронутый образ с оригинального диска Windows Vista или 7 и вставить в WDS, то в результате мы получим обычную установку Windows с той лишь разницей, что она будет происходить по сети. Что это дает? Во-первых, не нужно вскрывать компьютер или подсоединенять к нему внешние жесткие диски и cd/dvd. Соответственно, не нужно заботиться об их наличии. Во-вторых, поскольку процесс уже налажен, легко будет в дальнейшем заменить оригинальные образы другими, предварительно сконфигурированными, с файлами ответов, драйверами, программами и т.д. Можно даже будет держать образы, не прошедшие sysprep и специфичные для определенных типов железа, возможно, с различным набором программ. Т.е., то для чего часто используют Ghost, Acronis, Paragon и т.д.

=Make WinPE=
1. Copy x86 C:\WinPE_x86
Copype amd64 C:\winpe_x64

2 . Copy "C:\Program Files\Windows AIK\Tools\PETools\x86\WinPE.WIM C:\MyWinPE\ISO\sources\Boot.WIM

3. Copy "C:\Program Files\Windows AIK\Tools\x86\ImageX C:\MyWinPE\ISO\

4. ImageX /mountrw C:\c-drive.wim 1 C:\mounted-images\

dism /Mount-WIM /WimFile:C:\winpe_x86\ISO\sources\boot.wim /index:1 /MountDir:c:\winpe_x86\mount

5. oscdimg -n -bC:\MyWinPE\etfsboot.com C:\MyWinPE\ISO\ C:\MyWinPE.ISO

=Create answer file=
Это делается при помощи Windows SIM

=Syspreping OS=
For Vista/7
C:\Windows\System32\sysprep\sysprep.exe /oobe /generalize /unattend:sysprep.xml
(for Windows XP take sysprep from original CD, Deploy.cab file).

If after syspreping and rebooting you come with error "The system registry contains invali file paths." it's what you have to do:
1. Before syspreping export Mounted Devices key from a registry (HKLM\SYSTEM\MountedDevices) and don't close it!
2. Open a cmd prompt and run sysprep -oobe -generalize -quit
Seems that Sysprep delete this registry key. In my opinion this is a bug.
3. Then import to registry the saved Mounted Devices key.
4. Shutdown computer and Boot it with WinPE.
5. Capture disk image with ImageX (or Ghost).

=Capture image=
E:\ImageX /capture D: D:\MyImages.WIM "MyVista86image"

Будьте внимательны и дважды проверьте, какой логический диск вы захватываете и куда. Захват нужно осуществлять с логического диска, на котором находится программа ImageX.
Как вы, наверное, заметили целевым местом, на которое можно класть образ, может быть источник, то-есть тот логический диск, с которого образ снимается.
Бывает трудно понять, сколько логических дисков существует и какие у них буквы. Есть хороший совет, найденный на просторах Интернета. Если нужно узнать, какие логические диски существуют и какие у них буквы, можно открыть программу Notepad и использовать ее диалог Save as или Open вместо Windows Explorer.

=Mounting image=
ImageX /mountrw C:\c-drive.wim 1 C:\mounted-images\

dism /Mount-WIM /WimFile:C:\winpe_x86\ISO\sources\boot.wim /index:1 /MountDir:c:\winpe_x86\mount

=Make ISO=

=Apply (Deploy)=
ImageX /apply D:\MyImages.WIM 1 C:\

P.S.
Take in mind that WAIK-7 is not supporting WinXP, for working with XP you have to deal with WAIK-Vista.

P.S.2
If after syspreping and rebooting you come with error "The system registry contains invali file paths." it's what you have to do:
1. Before syspreping export Mounted Devices key from a registry (HKLM\SYSTEM\MountedDevices) and don't close it!
2. Open a cmd prompt and run sysprep -oobe -generalize -quit
Seems that Sysprep make deleting
3. Then import to registry the saved Mounted Devices key.
4. Shutdown computer and Boot it with WinPE.
5. Capture disk image with ImageX (or Ghost).

сделать Sysprep:
На висте: C:\windows\system32\sysprep\sysprep.exe /oobe /generalize /shutdown (/quit)
на XP: sysprep -mini -reseal

Далее делается capturing при помощи диска WindowsPE или Capture image по сети и ImageX, который в них содержится.
GUI для imagex = gImageX
При загрузке обычно нужно нажимать F12.

Если используется загрузочный образ Server 2008, то в меню выбора OS можно будет увидеть только серверные системы. Возможно дело том, что он 64-битовый, а не в том, что он серверный. Это нужно будет проверить.

Лучшая информация об Answer file была найдена в книге Майнази о Windows Server 2008 R2.

Для эксперимента была выбрана виртуальная машина с 1-м процессором, находящаяся на сервере Hyper-V. Намеренно был взят образ реального компьютера Lenovo с целью убедиться, что различная аппаратная платформа не приводит к проблемам.

== Creating PE3 Bootable USB device. ==
I’ve used Windows PE for a long time. And I’ve grown to love it. It’s an extremely useful tool, not just for OS installation, but for diagnostics.

Since there’s a version of WinPe for x64 & x86 (& itanium) I like to keep both x64 & x86 on my USB stick. Essentially copying the each version to the root of the USB stick as needed. Meaning at any one time I have three copies of WinPE on my USB stick. Other applications I copy directly to my USB stick, so that I don’t have to remount the image every time i need another application added.

Shortly after Windows 7 was released came a new version of WinPE, WinPE 3.0 on the Windows Automated Installation Kit.

Preparing the USB stick.

You’ll need to prepare the USB stick. To do this open a command prompt using Run As Administrator and use the following commands.

diskpart
list disk
select disk 1
clean
create partition primary
select partition 1
active
format quick fs=fat32
assign
exit
exit

Make sure you select the correct disk by adjusting the third command above.

Getting WinPE 3.0 Quickly

I’ve already done this so I’ve uploaded it to save you some time. The new Windows AIK is 1.75Gb my files are 170Mb & 146Mb for x64 & x86 respectively. I’ve detailed the packages I’ve used below.

Download WinPE 3 x86 Architecture [146Mb]
Download WinPE 3 x64 Architecture [170Mb]
Files are hosted with HotFile as I don’t have enough storage to host them myself.

Both x86 & x64 versions are available.
WMI, HTA & Scripting Packages
ImageX copied to the image (System32 folder).
Once you’ve downloaded the file above, you can either copy the contents of the version of WinPE you wish to use to the root of the USB stick.

Creating a WinPE 3 Image

To create your own customised WinPE 3 image, you can follow Microsoft’s instructions here. The page details all the packages you can install and how to install them. The commands I used for each version are below.

Remember to run the Deployment tools Command Prompt As Administrator.

32-Bit WinPE 3

copype.cmd x86 c:\winpe_x86
copy c:\winpe_x86\winpe.wim c:\winpe_x86\ISO\sources\boot.wim
Dism /Mount-Wim /WimFile:C:\winpe_x86\ISO\sources\boot.wim /index:1 /MountDir:C:\winpe_x86\mount
Dism /image:C:\winpe_x86\mount /Add-Package /PackagePath:"C:\Program Files\Windows AIK\Tools\PETools\x86\WinPE_FPs\winpe-wmi.cab"
Dism /image:C:\winpe_x86\mount /Add-Package /PackagePath:"C:\Program Files\Windows AIK\Tools\PETools\x86\WinPE_FPs\winpe-hta.cab"
Dism /image:C:\winpe_x86\mount /Add-Package /PackagePath:"C:\Program Files\Windows AIK\Tools\PETools\x86\WinPE_FPs\winpe-scripting.cab"
copy "C:\Program Files\Windows AIK\Tools\x86\imagex.exe" C:\winpe_x86\mount\Windows\System32\imagex.exe
Dism /unmount-Wim /MountDir:C:\winpe_x86\mount /Commit

64-Bit WinPE 3

copype.cmd amd64 c:\winpe_amd64
copy c:\winpe_amd64\winpe.wim c:\winpe_amd64\ISO\sources\boot.wim
Dism /Mount-Wim /WimFile:C:\winpe_amd64\ISO\sources\boot.wim /index:1 /MountDir:C:\winpe_amd64\mount
Dism /image:C:\winpe_amd64\mount /Add-Package /PackagePath:"C:\Program Files\Windows AIK\Tools\PETools\amd64\WinPE_FPs\winpe-wmi.cab"
Dism /image:C:\winpe_amd64\mount /Add-Package /PackagePath:"C:\Program Files\Windows AIK\Tools\PETools\amd64\WinPE_FPs\winpe-hta.cab"
Dism /image:C:\winpe_amd64\mount /Add-Package /PackagePath:"C:\Program Files\Windows AIK\Tools\PETools\amd64\WinPE_FPs\winpe-scripting.cab"
copy "C:\Program Files\Windows AIK\Tools\amd64\imagex.exe" C:\winpe_amd64\mount\Windows\System32\imagex.exe
Dism /unmount-Wim /MountDir:C:\winpe_amd64\mount /Commit
Once you’ve followed all the instructions you can copy the contents of c:\\ISO\ to the root of the usb stick you are using.

6 comments:
Ryan said...
While your script uses DISM to install the language neutral packages, it fails to install the language specific packages. For example, on a 32-bit platform (for users in the US), you could find language specific packages in "C:\Program Files\Windows AIK\Tools\PETools\x86\WinPE_FPs\en-us".
6 November 2009 09:47

www.daiowen.co.uk

== WinPE 3.0 ==

http://4sysops.com/archives/build-a-bootable-windows-pe-3-0-usb-drive-with-rescue-tools-part-1/

For Windows PE 1.0, the minimalist Windows based on Windows 2003/XP, you needed an SA (Software Assurance), OEM, or ISV license. When Windows Vista was released everyone had access to Windows PE 2.0. This also applies to the Windows 7-based edition, Windows PE 3.0. Windows PE (Preinstallation Environment) was originally designed to deploy Windows. However, it is also useful in creating your own customized rescue boot media. In this article, I will describe how you can create a bootable Windows PE 3.0 (WinPE) USB stick, and, in my next post, I will show how to add your own rescue tools and how to keep your rescue stick up-to-date without much hassle. You will see that the procedure described here is much more convenient than most solutions you’ll find on the web.


1. Create a bootable USB drive

Before you get started, you have to make your flash drive bootable. I have already described this procedure in my post about the Windows 7 USB/DVD Download Tool. For your convenience here is the command sequence, which you should run on a command prompt with admin rights:

diskpart list disk select disk # clean create partition primary select partition 1 active format quick fs=fat32 assign exit

Replace ‘#’ with the drive number of your USB drive. Be careful because this procedure will erase the whole drive!

2. Copy the WinPE 3.0 files to the USB drive

WinPE 3.0 is part of the Windows Automated Installation Kit (WAIK) for Windows 7, which you can download here. Once you have installed the WAIK, you’ll find a folder of the Windows AIK on the Windows Start Menu. Launch the Deployment Tools Command Prompt and enter this command:

copype.cmd x86 c:\winpe_x86

Then, copy winpe.wim to the correct folder:

copy c:\winpe_x86\winpe.wim c:\winpe_x86\ISO\sources\boot.wim

Now, copy WinPE to your USB drive:

xcopy C:\winpe_x86\iso\*.* /e G:\

In this example, ‘G:’ is the drive letter of your flash drive.

Now you should be able to boot from your WinPE 3.0 USB drive. In my next post, I will outline the interesting part—that is, how to prepare your USB drive so that you can add new tools without starting again from scratch.

WinPE 3.0

http://4sysops.com/archives/build-a-bootable-windows-pe-3-0-usb-drive-with-rescue-tools-part-1/

For Windows PE 1.0, the minimalist Windows based on Windows 2003/XP, you needed an SA (Software Assurance), OEM, or ISV license. When Windows Vista was released everyone had access to Windows PE 2.0. This also applies to the Windows 7-based edition, Windows PE 3.0. Windows PE (Preinstallation Environment) was originally designed to deploy Windows. However, it is also useful in creating your own customized rescue boot media. In this article, I will describe how you can create a bootable Windows PE 3.0 (WinPE) USB stick, and, in my next post, I will show how to add your own rescue tools and how to keep your rescue stick up-to-date without much hassle. You will see that the procedure described here is much more convenient than most solutions you’ll find on the web.


1. Create a bootable USB drive

Before you get started, you have to make your flash drive bootable. I have already described this procedure in my post about the Windows 7 USB/DVD Download Tool. For your convenience here is the command sequence, which you should run on a command prompt with admin rights:

diskpart list disk select disk # clean create partition primary select partition 1 active format quick fs=fat32 assign exit

Replace ‘#’ with the drive number of your USB drive. Be careful because this procedure will erase the whole drive!

2. Copy the WinPE 3.0 files to the USB drive

WinPE 3.0 is part of the Windows Automated Installation Kit (WAIK) for Windows 7, which you can download here. Once you have installed the WAIK, you’ll find a folder of the Windows AIK on the Windows Start Menu. Launch the Deployment Tools Command Prompt and enter this command:

copype.cmd x86 c:\winpe_x86

Then, copy winpe.wim to the correct folder:

copy c:\winpe_x86\winpe.wim c:\winpe_x86\ISO\sources\boot.wim

Now, copy WinPE to your USB drive:

xcopy C:\winpe_x86\iso\*.* /e G:\

In this example, ‘G:’ is the drive letter of your flash drive.

Now you should be able to boot from your WinPE 3.0 USB drive. In my next post, I will outline the interesting part—that is, how to prepare your USB drive so that you can add new tools without starting again from scratch.


- Posted using BlogPress from my iPad

вторник, 13 ноября 2018 г.

Что нужно знать iTшнику-системщику, чтобы найти работу

Что сегодня должен знать iTшник-системщик, чтобы успешно искать и находить работу

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

1. Active Directory (FSMO, Group Policy/GPP, DNS, DHCP, Share/NTFS permissions),
2. почтовые системы (как правило, Exchange Server/Outlook),
3. серверы (блейды HP/CISCO/DELL/LENOVO),
4. системы виртуализации (VMWare/Hyper-V),
5. сториджи (Netapp/EMC),
6. архивирование данных и компьютеров (backup),
7.  системы управления NMS - Network Managent Systems (MS SCOM/SCCM, ITCM, Nagios, Zabbix).
8. безопасность (Antiviruses, Firewalls, Group Policies и различные устройства и программы).
9. сети (Cisco/HP/Juniper),
10. Linux/UNIX,
11. скриптология: PowerShell, Python, VB script, bash-scripts. Виндоузятникам особое внимание обратить на PowerShell.
12. и даже некоторые знания в области SQL Server/Oracle, включая sql queries и некоторые вещи системного плана, например, подготовка к установке SQL Server

С опытом появляется понимание того, как backup связан с работой других систем - Exchange или SQL Server. Например, полезно знать, что после успешного бэкапа Exchange удаляет логи, которые в противном случае будут расти до заполнения всего дискового пространства. Но в случае кластеризации Exchange или SQL Server бэкап будет работать несколько иначе. А в случае испорченных логов бэкап сделать не получится и логи будут расти. Что здесь делать? Ну, скажем, временно включить функцию Circular Logging. А если база данных уже отключилась из-за нехватки места, надо будет выпросить у специалиста по Netapp расширение места на LUN (если, конечно, вы сами не являетесь управителем Netapp). А если все эти меры не помогли, придется перенести все mailboxes на вновь созданную базу данных. А если и это не поможет, то надо будет попробовать обновить Exchange при помощи rollup updates.

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


Первые 4 области нужны почти всегда и одновременно. Остальные весьма вероятно могут понадобиться. Часто требуются специалисты в паре областей, например Storage/Backup или Storage/Virtual, а лучше Storage/Backup/Virtual. И если систему виртуализации можно выучить дома, при наличии достачно ресурсного компьютера, то сториджи или ленточные backups домой не купишь и их можно выучить только на работе или хотя бы познакомиться на специализированных курсах.

Нужно учесть при этом, что грамотные работодатели понимают, что просто "знать" систему даже после хороших курсов недостаточно. Если вас сажают на поддержку системы, вам нужно сразу решать проблемы, а на курсах или в домашней лаборатории все обычно работает гладко и проблемы, если есть, не те же самые, что в реальной среде.

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

Да, системщик должен всегда учиться и постоянно переучиваться, иначе ему нечего делать в профессии. А знания часто приходится буквально выдирать зубами, если вы хотите быть конкурентноспособным. Для этого, кстати, полезно регулярно менять работу, скажем, каждые два года, особенно в начале карьеры.

Лучшие книги по iT технологиям

Моя цель создать страницу со ссылками на лучшие бесплатные книги в теме iT.
Таких немного, поэтому буду рад, если вы сможете подсказать ресурсы.

Начнем с книги-библии по Нутаникс (Nutanix).
Она затрагивает не только специфический продукт. Разговор идет о различных технологиях, начиная от Mainframe через Storage, Virtualization, Solid State Disks и до Cloud и Hyper-Convergence.

The Nutanix Bible
http://nutanixbible.com/

среда, 7 ноября 2018 г.

How to find logon DC + all DC's in different domains

First of all, I would like to put in the beginning all the commands and only then explain all of them.

# Command Line
* SET L
* nltest /DCLIST:
* netdom query dc
* dsquery server
gpresult /R
* set type=all
_ldap._tcp.dc._msdcs.DOMAIN_NAME
* (Get-ADDomainController -DomainName [Domain FQDN] -Discover -NextClosestSite).HostName
# PowerShell
Get-ADDomainController -filter * | FT Name
Get-ADGroupMember 'Domain Controllers' | FT Name
Get-ADComputer -LDAPFilter "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=8192))" | FT Name
Get-ADDomain -Identity milgam.local | Select-Object -ExpandProperty ReplicaDirectoryServers

Иногда нужно найти имя одного из контроллеров вашего домена (DC).
Есть несколько способов это выяснить - они могут быть или надежнее или проще.
Все они работают из CMD.

Самый простой, но не работает в некоторых ситуациях (соединение VPN, локальный logon):
SET L
Команда показывает тот DC, который служил для входа вашего компьютера. Если вы вошли локально (не в домен), то DC вы не увидите.

Следующая команда посложнее, но еще поддается запоминанию:
nltest /DCLIST:
 
При помощи nslookup можно надежно выяснить имя DC, но не каждому понравится синтаксис:
Start -> Run -> nslookup
set type=all
_ldap._tcp.dc._msdcs.DOMAIN_NAME


Отличная и простая команда: 
gpresult /R
Here you nedd to go to USER SETTINGS
and then search for a line:
Group Policy was applied from:      domain.com
В соответствии с современными тенденциями приведем команду PowerShell:
Import-Module ActiveDirectory
(Get-ADDomainController -DomainName [Domain FQDN] -Discover -NextClosestSite).HostName
Здесь требуется знать Domain FQDN.

If you need to find all DCs different domains, the best option is to use nltest command because you can get DCs from other domains and, even, forests.
If it's enough to find DCs from your logon domain there are additional options: netdom and dsquery.

Here is the syntax:
* nltest /DCLIST:
* netdom query dc
* dsquery server

Put attention to the syntax of nltest - you must put here FQDN of the domain name.

# All DCs in a domain in PowerShell way - 4 
Get-ADDomainController -filter * | FT Name

Get-ADGroupMember 'Domain Controllers' | FT Name

Get-ADComputer -LDAPFilter "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=8192))" | FT Name


Get-ADDomain -Identity milgam.local | Select-Object -ExpandProperty ReplicaDirectoryServers





воскресенье, 4 ноября 2018 г.

Как убить Chrome

Chrome is a good program as all we all know, but...
it uses a separate process for every tab it uses and it can eat a lot of RAM,
therefore we need sometimes to kill a Chrome, all its instances at once.
It is hardly possible with Task Manager GUI so we need CLI tool for our task.
There is such a tool and the good news - it is built in.
So all we need is to create a small batch-file and use it in case of need.

::==Start==
@echo off
Taskkill /T /IM chrome.exe /F
Taskkill /T /IM firefox.exe /F
Taskkill /T /IM iexplore.exe /F
EXIT /B
::==End==

As you see this file is closing all instances of all widespread browsers.

Explanation from Taskkill help:
/T -   Terminates the specified process and any child processes which were started by it.
 /IM   imagename - Specifies the image name of the process to be terminated.
Wildcard '*' can be used to specify all tasks or image names.
/F - Specifies to forcefully terminate the process(es).

It is also possible to terminate processes by PID or even by using of RAM.
There is more detailed description of applications killing on our site:

среда, 31 октября 2018 г.

PowerShell - Odd and Even numbers script

cls
# Odd and Even numbers script
# Gives Sum of odd, then even numbers and counts them, then compares.
# The result come in form of one line with headers.

$InputFile = "D:\SCRIPT\input-output\input.txt"
$OutputFileOdd = "D:\SCRIPT\input-output\OddArray.csv"
$OutputFileEven = "D:\SCRIPT\input-output\EvenArray.csv"
$OutputFileArray = "D:\SCRIPT\input-output\NumbersArray.csv"
$Content = Get-Content $InputFile
# The following line is for creating an empty array.
# @()

# The following line is for creating array of numbers in place.
# [int[]] $NumbersArray = 0 .. 10

# Following is zeroing of variables.
$Flag = 0
$OddCount = 0
$OddSum = 0
$EvenCount = 0
$EvenSum = 0
$OddArrayCount = 0
$EvenArrayCount = 0
$Sum = 0
$Count = 0

# This array is usable in case of creating multi-line Excel but it's not our case.
# $CSVArray = New-Object System.Collections.ArrayList

# The following lines create arrays for odd and even numbers.

$OddArray = New-Object System.Collections.ArrayList
$EvenArray = New-Object System.Collections.ArrayList

# The cycle finds the remainder that help us to understand if the number is odd or even.
# Then odd and even arrays are filled up with odd and even numbers.
ForEach ($Number in $NumbersArray)
   {
            If ($Number -ne 0)        
        {
            $Remainder = $Number % 2
                   
            If ($Remainder -eq 0) { $Flag = "Even" } Else { $Flag = "Odd" }

            If ($Flag -eq "Odd")
            {
                $OddArrayNumber = New-Object -Type PSObject
                $OddArrayNumber | Add-Member -MemberType NoteProperty -Name "Odd" -Value "$Number"
                $OddArray.Add($OddArrayNumber)
                $OddCount = $OddCount + 1
                $OddSum = $OddSum + $Number
            }       
            If ($Flag -eq "Even")
            {
                $EvenArrayNumber = New-Object -Type PSObject
                $EvenArrayNumber | Add-Member -MemberType NoteProperty -Name "Even" -Value "$Number"
                $EvenArray.Add($EvenArrayNumber)
                $EvenCount = $EvenCount + 1
                $EvenSum = $EvenSum + $Number            
            }
            $Count = $Count + 1
            $Sum = $Sum + $Number 
        }               
        $Flag = 0
   }
       $OddArray | Export-Csv $OutputFileOdd -NoTypeInformation
       $EvenArray | Export-Csv $OutputFileEven -NoTypeInformation

       $OddArrayCount = $OddArray.Count
       $EvenArrayCount = $EvenArray.Count

# New object $ArrayLine is created in every loop for Excel line.
# It fills up with count and sum for odd and even numbers.
$ArrayLine = New-Object -Type PSObject
$ArrayLine | Add-Member -MemberType NoteProperty -Name "OddArrayCount" -Value "$OddArrayCount" -Force
$ArrayLine | Add-Member -MemberType NoteProperty -Name "OddCount" -Value "$OddCount" -Force
$ArrayLine | Add-Member -MemberType NoteProperty -Name "OddSum" -Value "$OddSum" -Force

$ArrayLine | Add-Member -MemberType NoteProperty -Name "EvenArrayCount" -Value "$EvenArrayCount" -Force
$ArrayLine | Add-Member -MemberType NoteProperty -Name "EvenCount" -Value "$EvenCount" -Force
$ArrayLine | Add-Member -MemberType NoteProperty -Name "EvenSum" -Value "$EvenSum" -Force

$ArrayLine | Add-Member -MemberType NoteProperty -Name "SUM" -Value "$SUM" -Force
$ArrayLine | Add-Member -MemberType NoteProperty -Name "COUNT" -Value "$COUNT" -Force

# Adding values to two-dimensional array for output to Excel.
# $CSVArray.Add($ArrayLine) | Out-Null
$ArrayLine | Export-Csv $OutputFileArray -NoTypeInformation

Write-Host Flag = $Flag
Write-Host OddCount = $OddCount
Write-Host OddSum = $OddSum
Write-Host EvenCount = $EvenCount
Write-Host EvenSum = $EvenSum

Write-Host OddArrayCount = $OddArrayCount
Write-Host EvenArrayCount = $EvenArrayCount
Write-Host General SUM = $SUM
Write-Host General COUNT = $COUNT
Write-Host "The job is Done"
Write-Host ""

понедельник, 29 октября 2018 г.

Computer Uptime или сколько времени работает ваш компьютер

Сначала мы рассмотрим, как определить время на локальном компьютере, а затем на удаленном. 
Метод #1 - Task Manager
В Windows 10 кликаем на Taskbar, затем 

суббота, 27 октября 2018 г.

Time Changing

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

Net Time or w32time ?

Вы все, наверное, знаете, что для проверки и настойки времени на компьютерах Windows используются две команды: Net Time и w32time. Вопрос, в чем между ними разница и когда использовать каждую из них.

w32time расшифровывается как Windows Time Service. Это сервис, который бежит на большинстве Windows компьютеров, начиная с Windows 2000. Он состоит из сервиса времени (w32time) и пользовательского приложения w32tm.exe для управления и мониторинга. Сервис использует UDP порт 123 и синхронизируется при помощи протокола NTP.

NET TIME, а точнее приложение net.exe, использует библиотеку NetApi32.dll. Работа со временем лишь одна из множества функций net.exe. Для доступа к удаленным компьютерам net.exe использует RPC, а не NTP. По этой причине NET TIME релевантен и сегодня, хотя родился он еще до эпохи Win 2000. Правда, с другой стороны,  UDP 123 редко блокируется, что является плюсом.

Если нужно выяснить "исправность" времени сразу на нескольких компьютерах, можно использовать простейший batch-файл, который может выгляеть таким образом:

NET TIME \\Server1
NET TIME \\Server2
NET TIME \\Server3

среда, 24 октября 2018 г.

Logoff remote User


Иногда, особенно в большой сети, некий сервер может стать недоступным для входа при помощи, скажем, RDP (Remote Desktop Protocol).
Обычно, причина для этого, количество залогиненных пользователей, которое превышает два.  

Существуют инструменты командной строким которые удаленно способны решить проблему.
Rwinsta
Qwinsta
Quser
Logoff
Query Session


First, check the session number with qwinsta:

QWINSTA /server:YOURCOMPUTERNAMEHERE
Write down the session ID.

Then use the logoff command:

LOGOFF YOURSESSIONIDHERE /server:YOURCOMPUTERNAMEHERE


CMD Tips-n-Tricks или "полезняшки" командной строки

Как получить DATE и TIME в командной строке?
date /t и echo %date% дают одинаковый результат, хотя и работают по-разному - как команда и как переменная окружения (environment variable).

Более старые рекомендации:
ECHO. |TIME > TIME
COPY LOG.TXT +TIME

---START---
@echo offset log=C:\temp\program.log
echo I am starting for you program.exe at %date% %time% >> %log%
program.exe >> %log%
echo. |time |find "current" >> log.txt
---END---

Если нужно вывести время начала работы какой либо программы в log-файл:


среда, 17 октября 2018 г.

Как добавить Exchange PowerShell module в сессию

Как добавить Exchange PowerShell module в сессию

Как добавить Exchange PowerShell module в стандарную сессию PowerShell?Короткий ответ следует ниже. Полный ответ следует далее.
Exchange 2007Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin
Exchange 2010Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
Exchange 2013 2016Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn

Далее описывается метод добавления Exchange Management Shell в ISE. Компоненты, которые мы используем для этого такие:

- ISE console
- ISE PowerShell profile
- PowerShell script, который загружается в Exchange Management Shell.

- Exchange Management Tools должны быть установлены на вашем компьютере.(Setup.exe /Role:ManagementTools /IAcceptExchangeServerLicenseTerms)

Если есть проблема во время инсталляции
The following error was generated when "$error.Clear();
if($RoleInstallWindowsComponents){# Install any Windows Roles or Features required for the Management Tools role
Install-WindowsComponent -shortNameForRole "AdminTools" -ADToolsNeeded $RoleADToolsNeeded}"
was run: "The system cannot find the file specified".

   Open Control Panel, and then select Programs.
    Click Turn Windows features on or off.
    Select Microsoft .NET Framework 3.5.1.
    Navigate to Internet Information Services > Web Management Tools > IIS 6 Management Compatibility.
    Select the check box for IIS 6 Management Console, and then click OK.
    Restart you PC
    Install Exchange admin tools

That should do the trick.

вторник, 16 октября 2018 г.

Partition Managers

MiniTool Partition Wizard Home Edition

AOMEI Partition Assistant Home

EaseUS Partition

MasterParagon Partition Manager Free Edition

Partition Magic

Ranish Partition Manager

Partition LogicGParted 

Отмена warning message в Office при открытии EXE файла

Исходные данные - Office 2010, Windows 7.

Ситуация такая - экран компьютера засорен множеством ярлыков на программы. Мне показалось, что имеет смысл сделать примитивный application launcher на основе Excel.
Нажимаешь на ячейку, которая является Hyperlink к исполняемому файлу (exe, com, bat) и программа включается.
Другие поля могут служить названиями программ и комментариями. В Excel это может выглядеть достаточно удобно и не требует особых навыков - каждый может такое сделать.

Так и было сделано. И все бы хорошо, но один момент мне не давал покоя. Когда я нажимал на Hyperlink программа открывалась, но с предупреждением о возможном вирусе, после чего нужно было нажимать на OK. Причем, программы располагались на сетевом диске.
После недолгих поисков в интернет я нашел несколько решений, но они не работали. Все, кроме одного. Вот оно.

Modify the HKEY_CLASSES_ROOT\\EditFlags registry subkey

Use this method if the warning message affects multiple computers. 
To disable the warning message, follow these steps:
  1. Click Start, click Run, type regedit, and then click OK
  2. Locate the following registry subkey: 
    HKEY_CLASSES_ROOT\\EditFlags
    For example, if the file name extension is WMV, select HKEY_CLASSES_ROOT\WMVFile\EditFlags
  3. Click EditFlags, and then click Rename on the Edit menu.
  4. Type OldEditFlags, and then press ENTER.
  5. On the Edit menu, point to New, and then click DWORD value.
  6. Type EditFlags, and then press ENTER.
  7. On the Edit menu, click Modify.
  8. In the Edit DWORD Value dialog box, click Hexadecimal under Base.
  9. Type 10000, and then click OK.

Как открыть папку, файл или программу из командной строки CMD?

Вопрос, вроде бы, элементарный?
Но иногда в экстренный момент нужен ответ, а он не подворачивается.
Ответ простой - команда Start.

Примеры на открытие папки (folder, directory):
start C:
start C:\Windows
Можно и так:
start explorer C:
start explorer C:\Windows
однако первый способ быстрее в открытии и проще в написании.

Примеры на открытие файла:
start c:\file.txt (при условии, что такой файл существует)
start c:\file.doc

Примеры на открытие программы:
start calc
start notepad
start winword

Можно также открыть программу с файлом в качестве параметра:
start winword c:\file.doc
Однако у такого способа нет преимущества перед способом без указания открывающей программы, за исключением случая, когда нужно использовать нестандартную программу (ту, которая не является дефолтивной).

А что, если нужно открыть серию папочек на удаленном компьютере в локальной сети?
И делать это регулярно. Тогда лучше включить команды в batch-файл, например такой:
:===START===
@echo off
start \\Server1\C$
start \\Server1\C$
start \\Server1\C$
EXIT /B
:===END===

Для открытия локальных или удаленных папок есть интересная команда Pushd. 
Она, по сути, не открывает папки, а создает сетевые диски. Для локального компьютера можно использовать такую команду:

pushd \\localhost\C$
 
Обратите внимание на две вещи:
- Pushd автоматически создает сетевые диски, начиная с буквы Z: и далее в обратную сторону,
Pushd автоматически перемещает вас на созданный сетевой диск.
Это верно, даже если вы создаете диск для папки в глубине файловой системы:
По сути, команда сействует аналогично старинной команде Subst, но не локально, а по сети.

Да, а что же насчет сетевых дисков для удаленных компьютеров, ведь наши примеры касались только локального компьютера? Очень просто: localhost заменяем на имя удаленного компьютера:
pushd \\Server1\C$










четверг, 11 октября 2018 г.

Как убить процесс или сервис. How to kill process or service.

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

Основа всего процесс - он является основой для сервисов и аппликаций и выполняет exe файл. В типичных случаях дело обстоит следующим образом:

- аппликация - это процесс с окошком или программа, с которой мы можем взаимодействовать,
- сервис - это процесс, не имеющий окна, т.е., работающий "скрытно". Кроме того признаком сервиса является его свойство выдерживать logoff.

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

Подробное объяснение займет больше места, но для наших целей этого достаточно.

Убийством можно заниматься при помощи различных "орудий": Net, Sc, Taskkill, PSKill, Wmic, PowerShell (to name some). 

Для остановки/поднятия сервиса (звучит мягче, чем убийство ?) чаще используют команды Net и Sc.
net stop spooler
net start spooler
Аналогично:
sc stop spooler
sc start spooler
Разница между net и sc нас пока не занимает.

Нужно заметить, что spooler является сервисом, основанном на процессе с именем spoolsv.exe.

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

Для чего может понадобиться убивать процесс, если достаточно опустить сервис? 

Резон для этого таков, что процесс может не захотеть опускаться или может застрять в процессе опускания.

Сначала путь для простого пользователя:

Включаем services.msc, находим сервис и определяем его реальное имя.
Затем идем в CMD, пишем sc queryex [servicename] и замечаем PID процесса.
Не выходя из CMD пишем taskkill /pid [pid_number] /f
После нажатия на Enter дело сделано. 

Вместо PID процесса можно использовать его имя, для этого достаточно использовать параметр /im: taskkill /im [process_name] /f

Кажется, что так удобнее, ведь имя процесса "человечнее" и узнать его легче, чем PID. Кроме того, имя не меняется при каждом запуске процесса, в отличие от PID и его легче заложить в Batch файл.
Проблема метода в том, что так убиваются все процессы с соответствующим именем. С другой стороны, иногда это как раз необходимо, как в случая с Chrome, который на каждое окошко открывает отдельный процесс, кушая при этом много памяти, а опустить все его инстансы (instances) по PID вручную может быть затруднительно. 

И здесь очень поможет следующая команда: 

taskkill /im chrome.exe /f
Просто приятно было наблюдать все эти десятки процессов-окошек, закрывающихся на глазах изумленного себя.:)

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

В качестве примера возьмем Spooler, ответственный за печать. Он безопасен для системы и является примером процесса-сервиса.

Если Spooler поднят, tasklist выдаст errorlevel 1, а если опущен - errorlevel 0.
Теперь попытаемся опустить Spooler при помощи net stop, а в случае неудачи применим taskkill.
::---Start
tasklist /fi "imagename eq spoolsv.exe" |find ":" > nul
if errorlevel 1 net stop "spooler"
if errorlevel 1 taskkill /f /im "spoolsv.exe"
::===END

Обратите внимание на различие в именах сервиса (spooler) и исполняемого файла (spoolsv.exe).

Обратите также внимание: не играет роли то, что проверка выполняется на сервис, а поднимаем мы процесс. Все работает. 

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

::---Start
tasklist /fi "imagename eq spoolsv.exe" |find ":" > nul
if errorlevel 0 net start "spooler"
::===END

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

::---Start
net stop spooler
ping 127.0.0.1 -n 10 -w 1000 > nul
net start spooler
::===END

Этот простой прием даст вам отсрочку в 10 секунд.


Ну, а когда закончите читать статью при помощи браузера Chrome, можете вместо Spooler использовать слово Chrome. Только поставьте значок комментария перед строчкой net stop, т.к., этот процесс является примером аппликации, не имеющей сервиса. 

Ок, я помогу...

::---Start
@echo off
taskkill /t /im chrome.exe /f
EXIT /B
::===END

Good luck!






среда, 10 октября 2018 г.

PoSH - Get-Process примеры

Get-Process | Sort-Object WorkingSet -Descending | select -First 5
Get-Service | Sort-Object WorkingSet, DisplayName -Descending | select -First 5
14,14,5,6,7,1,54,4,4,5,6,1,0,33,3,5 | sort -Unique
Get-EventLog Application -Newest 100 | sort Source -Unique

PoSH - Get-Service примеры

# Get-Service
get-service -displayname 'Background Intelligent Transfer Service'
get-service | where {($_.status -eq "Running") -and ($_.CanStop -eq $true)}
get-service | where {($_.status -eq "Running") -and !($_.CanStop -eq $true)} # Negation
get-service | ? { $_.status -eq 'running' -and ($_.canstop) }
get-service | ? { $_.status -eq 'running' -and !($_.canstop) } # Negation
Get-Service | Get-Member canstop

# Sort and Select:
Get-Service | Sort-Object WorkingSet,DisplayName -Descending  | select -First 5

PoSH - инсталляция модуля AD на Windows 7

# For Workstation
Get-Help *WindowsFeature
Import-Module ActiveDirectory
Get-WindowsFeature | where name -like RSAT-AD-PowerShell | Install-WindowsFeature

# For Server
Install-WindowsFeature
Install-WindowsFeature Desktop-Experience
Windows-identity-foundation
Import-Module ServerManager
Add-WindowsFeature RSAT-AD-PowerShell
gcm | ? { $_.ModuleName -eq 'ServerManager' }

PoSH - ScriptAnalyzer - Install, Check and Use

# Install PSScriptAnalyzer
Install-Module -Name PSScriptAnalyzer -Scope CurrentUser
Get-Module -Name PSScriptAnalyzer -ListAvailable
Import-Module -Name PSScriptAnalyzer

# Check PSScriptAnalyzer
Get-Command -Module PSScriptAnalyzer
Get-ScriptAnalyzerRule

#--- Use ScriptAnalyzer
$InvokePATH = & 'C:\Scripts\GoodScript.ps1'
Invoke-ScriptAnalyzer $InvokePATH

вторник, 9 октября 2018 г.

PoSH Tips-n-Tricks или "полезняшки"

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

Эта статья задумана как сборник различных "Tips-and-Tricks", которые, будучи собранными в одном месте, смогут напомнить вам (и мне) о существовании и способе применения различных команд, а также смогут помочь справиться с различными стандартными и нестандартными ситуациями.

В этом словаре-напоминалке не будет подробных объяснений команд, а параметры будут даны только самые необходимые - минималистский подход.

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

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Measure-Object (измерения различных значений)
# Объем RAM компьютера в Mb:
(Get-WmiObject Win32_PhysicalMemory | Measure-Object Capacity -sum).sum/1mb

# К-во процессов на компьютере:
(Get-Process | measure VirtualMemorySize -Sum).count

# Объем памяти RAM, занятой всеми процессами, в Mb:
(Get-Process | measure VirtualMemorySize -Sum).sum/1mb

#---Start
# RAM, округленный до двух знаков после точки:
$VMMemSize = (Get-Process | measure VirtualMemorySize -Sum).sum/1mb
$VMMemSize2 = [math]::round($VMMemSize,2)
Write-Host "Rounded VMMemSize = $VMMemSize2 Mb"
#---Stop

# How to check where TEMP folder located:
$env:temp

# Размер папки TEMP:
(dir $env:temp | Measure-Object -Property length -sum).sum/1mb

#---Start
# Размер папки TEMP с округленным значением и коротким синтаксисом:
$FolderSize = (dir $env:temp | measure length -sum).sum/1mb
$FolderSize2 = [math]::round($FolderSize,2)
Write-Host Rounded RAM = $FolderSize2 Mb
#---Stop

Как проверить время работы скрипта - два способа.

#---START первый способ
Write-Host ""
$Timing1 = (Measure-Command { H:\Experiment\Get-WmiObject.ps1 }).totalseconds
Write-Host "Timing1 is $Timing1"
Write-Host ""
#---END первый способ

#---START второй способ (NET Stopwatch)
$sw = [Diagnostics.Stopwatch]::StartNew()
H:\Experiment\Get-WmiObject.ps1
$sw.Stop()
$Timing = ($sw.Elapsed).Milliseconds
Write-Host "Script was running $Timing Miliseconds"
Write-Host ""
#---END второй способ (NET Stopwatch)

Как проиграть звуковой файл из PowerShell? Да, это возможно!
$PATH = ’D:\Hey Jude.wav’
$PlayWav=New-Object System.Media.SoundPlayer
$PlayWav.SoundLocation=$PATH
$PlayWav.playsync()

Как пользоваться командами Get-WmiObject?

# Следующие 3 команды дают одинаковый результат - данные о BIOS компьютера:
Get-WmiObject -Class win32_bios -ComputerName $env:COMPUTERNAME
Get-WmiObject -Class win32_bios -ComputerName localhost
Get-WmiObject -Class win32_bios -ComputerName .

Как получить данные об удаленном компьютере?
Команда запрашивает имя/IP компьютера, вы его вводите - результат налицо!
(точка или localhost также принимаются в качестве ответа)
#---START
$ComputerName = Read-Host -Prompt "Enter computer name or IP"
Get-WmiObject -Class win32_bios -ComputerName $ComputerName
#---END

# Как проверить, какая версия PoSH установлена - 32 или 64 bit?
[Environment]::Is64BitProcess

How to install NTFSSecurity module:
Get-Module -ListAvailable # (проверка имеющихся модулей)
Install-Module -Name NTFSSecurity

PoSH - эффективность команды Get-ADComputer

Предположим, нам нужно получить данные о серверах домена Active Directory при помощи команды Get-ADComputer. Как быстрее и эффективнее выполнить команду?
Приведу несколько примеров в скрипте, который измеряет время выполнения 6 различных вариантов команды.

#---START
Clear-Host
$startTime = (Get-Date)
Get-ADComputer -Filter {OperatingSystem -Like '*Server*'} | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime1 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 1: $ElapsedTime1"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter * | Where-Object OperatingSystem -Like '*Server*' | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime2 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 2: $ElapsedTime2"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter {OperatingSystem -Like '*Server*'} -Properties * | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime3 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 3: $ElapsedTime3"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter * | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime4 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 4: $ElapsedTime4"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter * -Properties * | Where-Object OperatingSystem -Like '*Server*' | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime5 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 5: $ElapsedTime5"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter * -Properties * | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime6 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 6: $ElapsedTime6"
Write-Host ""
#---END


Operation1 - чемпион скорости, занимает долю секунды, ведь мы сразу выбираем только серверы.
Operation2 - занимает чуть больше секунды, т.к. сначала выбираются все компьютеры домена и только позже происходит отбор серверов.
Operation3 - около 13 сек.. Хотя отбор серверов происходит вначале, как и в $SRV1 (т.е., серверов мало), но затем вместо 9 базовых у них берутся все свойства, которых больше 70.
Operation4 - время больше секунды, как и в $SRV2. В обоих случаях первоначально выбираются все компьютеры со стандартными свойствами. Различие лишь в том, что в данном случае не присходит отбор серверов (что чуть быстрее), хотя в переменную выводится больше имен (что чуть медленнее). Видимо, различия взаимно компенсируются, или же их влияние несущественно.
Operation5 - здесь сначала выбираются все компьютеры и у них берутся все свойства - это ДОЛГО -, а отбор серверов происходит на поздней стадии, что не уменьшает время. Правда, меньше времени тратится на запись в переменную (но это время минимально).
Operation6 - так же долго, как и в случае $SRV5 и это понятно: в обоих вариантах сначала выбираются все компьютеры и у них берутся все свойства. Ну, а отбор или отсутствие такового влияют незначительно.

Какие выводы можно сделать?
Во-первых, отбор (или уменьшение к-ва объектов) лучше делать в начале строки (т.е. слева), т.к. выгодно производить затратные операции над меньшим к-вом объектов.
Во-вторых, отбирайте только нужные свойства, иными словами, старайтесь как можно меньше использовать звездочку (*).
В-третьих, видно, что опрос Active Directory занимает гораздо больше времени, чем операции над объектами в памяти компьютера. Кстати, именно поэтому надо всегда стараться результат затратных операций выводить в переменные в случае необходимости повторного использования этих результатов.