четверг, 13 сентября 2018 г.

VMWare ESXi Inventory with PowerShell 1

# VMWare ESXi Inventory with PowerShell

===START===
Set-PowerCLIConfiguration -InvalidCertificateAction Ignore  -Confirm:$false
Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -Confirm:$false
Connect-VIServer -User maniak@fignya.net -Password P@ssword vCenter.fignya.net

$AllWMHosts = (Get-VMHost).name
$Output = New-Object System.Collections.ArrayList
foreach ($WMHost in $AllWMHosts) {
    $WMHost
    $TCFound = $true

    Try { Test-Connection -ComputerName $WMHOST -Count 1 -ErrorAction Stop }
    Catch { $TCFound = $false }

    if ($TCFound) {
    $IPTC = Test-Connection -ComputerName $WMHOST -Count 1 | Select-Object Address,IPV4Address
    $PingResult = "UP"
    $IPV4 = $IPTC.IPV4Address

$VMHostHardware = Get-VMHostHardware -VMHost $VMHost | Select-Object VMHost,Manufacturer,Model,SerialNumber
### $WMHostIPAdapter = (Get-VMHostNetworkAdapter -VMHost $WMHost).IP | Where-Object { $_.ip -ne "" }

    $DnsHostName = ""
    $Domain = ""
    $OSSystem = "ESX"
    $OSServicePack = ""
    $OSVer = ""
    $LLStamp = ""
    $OSDate = ""
    $DomainRole = ""
    $CompVendor = $VMHostHardware.manufacturer
    $CompModel = $VMHostHardware.model
    $CompSerial = $VMHostHardware.serialnumber
    }

    ELSE {
    $PingResult = "DOWN"
    $IPV4 = ""
    $OSSystem = "ESX"
    $OSServicePack = ""
    $OSVer = ""
    $LLStamp = ""
    $DnsHostName = ""
    $OSDate = ""
    $Domain = ""
    $Domainrole = ""
    $CompVendor = ""
    $CompModel = ""
    $CompSerial = ""
    }
    $Computerinfo = New-Object -Type PSObject
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Name" -Value "$WMHost" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "DNSHostName" -Value "$dnshostname" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Domain" -Value "$Domain" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "IP Address" -Value "$IPV4" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Ping" -Value "$PingResult" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "OS" -Value "$OSSystem" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Service Pack" -Value "$OsServicePack" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "OS Install Date" -Value "$OSDate" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Last Logon" -Value "$LLStamp" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Vendor" -Value "$CompVendor" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Computer Model" -Value "$CompModel" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Serial Number" -Value "$CompSerial" -Force
 
    $Output.Add($Computerinfo) | Out-Null

    $PingStatusCode = ""
    $PingResult = ""
    $VMHostHardware = ""
    $WMHostIPAdapter = ""
    }
$Output | Export-Csv H:\Scripts\Output_ESX.csv
ii C:\Output_ESX.csv
===END===

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

1. Set-PowerCLIConfiguration -InvalidCertificateAction Ignore  -Confirm:$false
2. Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -Confirm:$false

Следующая строка посоединяет нас к VMWare серверу.
3. Connect-VIServer -User maniak@fignya.net -Password P@ssword vCenter.fignya.net

В 4-ой строке мы видим "жирную" команду Get-VMHost, которая выдает довольно много информации обо всех подключенных ESXi хостах. В варианте (Get-VMHost).name команда выдает только имена хостов ESXi, что нам и нужно. Результат записывается в переменную $AllWMHosts.
4. $AllWMHosts = (Get-VMHost).name

Теперь нам нужно создать массив (фактически, набор строк и колонок), который будет находиться в памяти до конца работы скрипта. Массив (пока пустой) будет сидеть в переменной $Output и послужит заготовкой для создания таблицы Excel.
5. $Output = New-Object System.Collections.ArrayList

Цикл ForEach будет брать имена хостов из переменной $AllWMHosts и по-очереди забрасывать их в переменную $WMHost (которая здесь и создается).
Далее, в фигурных скобках обрабатывается имя одного хоста, затем процесс повторяется со следующим именем и т.д., пока не закончатся имена. Обработка заключается в проверке пингуемости хоста и, в случае удачи, вытаскивании из него Software/Hardware информации.
6. ForEach ($WMHost in $AllWMHosts) {

Для контроля $WMHost выдает на экран имя хоста, который обрабатывается в данном обороте цикла.
7.     $WMHost

Изначально в переменную $TCFound закладывается положительный результат.
8.     $TCFound = $true

Try/Catch пытается разделить ситуации пингуемости и непингуемости.
9.     Try { Test-Connection -ComputerName $WMHOST -Count 1 -ErrorAction Stop }
10.    Catch { $TCFound = $false }

Если в соединением все в порядке, командлет Test-Connection вытаскивает в переменную $IPTC информацию об имени и IP-адресе хоста, а также присваивает переменной $PingResult значение "UP", а переменной $IPV4 значение найденного IP-адреса.
11.    IF ($TCFound) {
12.    $IPTC = Test-Connection -ComputerName $VMHost -Count 1 | Select-Object Address,IPV4Address
13.    $PingResult = "UP"
14.    $IPV4 = $IPTC.IPV4Address

Далее, для получения "железной" информации, используется коммандлет Get-VMHostHardware. Из него вынимаются несколько значений и закладываются в переменную $VMHostHardware.
15. $VMHostHardware = Get-VMHostHardware -VMHost $VMHost | Select-Object VMHost,Manufacturer,Model,SerialNumber

Здесь показан альтернативный путь получения сетевой информации. Им мы решили пока не пользоваться.
### $WMHostIPAdapter = (Get-VMHostNetworkAdapter -VMHost $WMHost).IP | Where-Object { $_.ip -ne "" }

В следующих строках происходят 3 вещи:
- обнуляются показатели, которые присутствуют для совместимости,
- жестко закладывается название OS ESX, т.к. оно известно заранее,
- из переменной $VMHostHardware вынимаются несколько нужных значений.
16.    $DnsHostName = ""
17.    $Domain = ""
18.    $OSSystem = "ESX"
19.    $OSServicePack = ""
20.    $OSVer = ""
21.    $LLStamp = ""
22.    $OSDate = ""
23.    $DomainRole = ""
24.    $CompVendor = $VMHostHardware.manufacturer
25.    $CompModel = $VMHostHardware.model
26.    $CompSerial = $VMHostHardware.serialnumber
27.    }

В случае неудачи поля заполняются пустыми значениями, за исключением $PingResult (ведь нам известно, что хост в "дауне") и название операционной системы.
28.    ELSE {
29.    $PingResult = "DOWN"
30.    $IPV4 = ""
31.    $OSSystem = "ESX"
32.    $OSServicePack = ""
33.    $OSVer = ""
34.    $LLStamp = ""
35.    $DnsHostName = ""
36.    $OSDate = ""
37.    $Domain = ""
38.    $Domainrole = ""
39.    $CompVendor = ""
40.    $CompModel = ""
41.    $CompSerial = ""
42.    }

Далее создается новый объект $Computerinfo, который, фактически, является заготовкой заголовков будущей таблицы Excel, а также создания одной строки. В дальнейшем эти строки войдут в массив $Output.
43.    $Computerinfo = New-Object -Type PSObject
44.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Name" -Value "$WMHost" -Force
45.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "DNSHostName" -Value "$dnshostname" -Force
46.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Domain" -Value "$Domain" -Force
47.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "IP Address" -Value "$IPV4" -Force
48.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Ping" -Value "$PingResult" -Force
49.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "OS" -Value "$OSSystem" -Force
50.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Service Pack" -Value "$OsServicePack" -Force
51.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "OS Install Date" -Value "$OSDate" -Force
52.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Last Logon" -Value "$LLStamp" -Force
53.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Vendor" -Value "$CompVendor" -Force
54.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Computer Model" -Value "$CompModel" -Force
55.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Serial Number" -Value "$CompSerial" -Force

Здесь каждый оборот цикла одна строка из $Computerinfo заполняет массив $Output. В итоге, полностью заполненный массив будет передан в таблицу Excel.
56.    $Output.Add($Computerinfo) | Out-Null

Здесь происходит очистка переменных перед следующим оборотом цикла.
57.    $PingStatusCode = ""
58.    $PingResult = ""
59.    $VMHostHardware = ""
60.    $WMHostIPAdapter = ""
61.    }

Наконец массив заполнен и передается в файл Excel.
62. $Output | Export-Csv H:\Scripts\Output_ESX.csv

Строчка запускает полученный файл csv.
63. ii C:\Output_ESX.csv

Ping doesn't work, ARP works

Сегодня я столкнулся с такой проблемой:
некий сервер не может делать Ping никуда и никто его не может пинговать, однако, когда его пингуют с другого сервера, команда ARP -a показывает привязку его IP к MAC-адресу.

Проблема пока не решена, поэтому даю описание вводных данных.
Сервер Dell в формате Rack-mounted на основе Windows 2003. Он работает в стеке из 10 серверов, которые вместе производят массивные вычисления. Сервер имеет на борту 2 сетевые карты. 

Произведенные действия:
1. Мануальный IP адрес был заменен на автоконфигурационный, а в DHCP было сделано резервирование по MAC address. После перезагрузки компьютер получил свой IP адрес, однако пинговать не смог. Свой адрес и loopback 127.0.0.1 пингуются нормально. Любые адреса за пределами компьютера - нет, включая Default Gateway и компьютеры той же сети.

Интересный факт, который был уже упомянут - после пингования с другого сервера команда ARP -a показывает привязку его IP к MAC-адресу. Иными словами, сервер не может работать в сети на сетевом OSI Layer 3, но Layers 1 и 2 как-бы работают. О том же свидетельствует получение IP адреса от DHCP. 

2. Два сетевых кабеля были поменяны на сервере местами с соответствующими изменениями настроек IP. Результат нулевой. 

3. Был обнулен стек TCP/IP при помощи команд 
Netsh winsock reset 
Netsh winsock reset catalog
Netsh int ip reset reset.log
Результат нулевой. 

4. Был проверен Windows Firewall - найден в состоянии OFF при помощи GPO (greyed out).

Следующие предполагаемые шаги:
5. Применить Gpupdate /force (если это возможно)
6. Сделать рестарт в Safe Mode with Networking, чтобы элиминировать любые программные проблемы.
7. Запустить сервер с WinPE или аналогичного LiveCD с поддержкой сети с той же целью.
8. Переинсталлировать Network Card drivers.
9. Временно изменить IP address, чтобы убедиться, что адрес не является проблемой.
10. Изменить IP на другом компьютере на IP проблемного сервера с той же целью и чтобы убедиться, что нет конфликта IP  (кстати говоря, изначальная проблема по которой и был открыт кейс).
11. Попробовать изменить настройки Network Card с Autonegotiating на различные варианты постоянных (Speed, Duplex).
12. Переткнуть кабели на switch.
13. Заменить кабели.
14. Проверить исправность портов на switch или использовать другие порты.
15. Очистить ARP-кэш на switch (на этом и предыдущем пунктах понадобиться помощь сетевиков, поскольку у нас это только их работа).
16. Не забыть посмотреть в Event Viewer.
17. Сделать бесконечный Ping -t во время перезагрузки сервера, вдруг что-то проснется в процессе.
18. Еще раз проверить TCP/IP filtering в сетевых настройках.
19. Проверить локальные политики на предмет ICMP в разделе Gpedit.msc (или Secpol.msc): 
Computer Configuration - Policies - Administrative Templates - Network - Network connections - Windows firewall - Domain Profile...
20. Изменить DHCP резервирование на другой IP адрес.

Ну и еще несколько мыслей на подходе...









среда, 12 сентября 2018 г.

How to find local computer name

Вы знаете, как узнать имя компьютера, за которым вы сейчас сидите?
Не сомневаюсь!
А сколько способов вам знакомы?
Один, два - молодцы.
Три? - Грандиозно!
Я пока нашел 7 - и это не конец.

Первый способ работает только в CMD,.
второй и третий совмещают CMD и PowerShell,
с 4-го 7-ой - только PowerShell.

#1
SET Comp

#2
hostname

#3 Самый медленный способ, если вам нужно только имя.
systeminfo | find /i "Host Name"

#4
Get-WmiObject Win32_ComputerSystem | FT Name

#5 Информацию берет из переменной окружения %COMPUTERNAME%.
$env:COMPUTERNAME 

#6
get-childitem env:computername

#7
(Get-WmiObject -Class Win32_ComputerSystem -Property Name).Name

Кстати, команда systeminfo дает свойства удаленных компьютеров (и никто не сказал, что некоторые из остальных этого не умеют).
systeminfo /s  | find /i "Host Name"

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

How to install AD PowerShell module

How to install AD PowerShell module in Windows 7

Firstly check if there is an AD module:
Get-Module ActiveDirectory –listavailable

If you don’t see that line you need to take some actions.
Let's look what to do.

1.  Firstly install RSAT for Windows 7 from this link:

2.  Then you need to enable Features. I will show you how to it with command line in the right order.
We will use DISM command.

DISM
/online /enable-feature /featurename:RemoteServerAdministrationTools-Roles-AD

DISM /online /enable-feature /featurename:RemoteServerAdministrationTools-Roles-AD-DS

DISM /online /enable-feature /featurename:RemoteServerAdministrationTools-Roles-AD-DS-SnapIns

DISM /online /enable-feature /featurename:RemoteServerAdministrationTools-Roles-AD-Powershell

DISM /online /enable-feature /featurename:RemoteServerAdministrationTools-Roles-AD-DS-AdministrativeCenter

DISM /online /enable-feature /featurename:RemoteServerAdministrationTools-Roles-AD-DS-NIS

DISM /online /enable-feature /featurename:RemoteServerAdministrationTools-Roles-AD-LDS


3.  Now you can check if a feature exists with DISM:
dism /online /Get-Features /featurename:RemoteServerAdministrationTools-Roles-AD-Powershell

Or check it with PowerShell:
Import-Module ActiveDirectory

Now all AD commands in PowerShell should work just fine, f.e.:
Get-ADComputer -Filter *
 

 

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

PowerShell - inventory from a file

PowerShell - inventory from a file with a list of computers

Иногда системному администратору нужно получить инвентарный список компьютеров сети.
Для этого существуют различные программы, но даже платные коммерческие имеют недостатки, например, многие из них требуют установить агента на все компьютеры.
И тут иногда возникает вопрос, а на какие компютеры нам нужно поставить агентов. Т.е., даже в таком случае может возникнуть необходимость составить предварительный список компьютеров. Что говорить о тех случаях, когда у фирмы просто нет средств на покупку такой программы, да и зачем стрелять из пушки по воробьям, если вам нужно всего-лишь составить список компьютеров с их именами, IP-адресами и версией OS.
Именно такой случай мы и рассмотрим. А для этого вместе пошагово создадим небольшой скрипт, который с легкостью позволит это сделать.
Так выглядит конечный результат.

==Beginning of Script==
### Inventory from a file by vladisla2000.

$AllComputersNames = Get-Content C:\Scripts\input.txt
# Creating of Array
$ArrayTable = New-Object System.Collections.ArrayList

# Looping of all the names from C:\Scripts\input.txt file.
ForEach ($ComputerName in $AllComputersNames)
{
# The main line of the script which gets all the information from AD and puts it to a variable.
$ComputerOS = Get-ADComputer -Identity $ComputerName - Properties * | Select-Object Name,IPv4Address,OperatingSystem
# Extraction of the properties to the different variables.
$IPV4 = $ComputerOS.IPv4Address
$OS_System = $ComputerOS.OperatingSystem
# Creating of the new object.
$Computerinfo  = New-Object -Type PSObject
# Filling the object with information from variables.
$Computerinfo | Add-Member -MemberType NoteProperty -Name "ServerName" -Value "$ComputerName" -Force
$Computerinfo | Add-Member -MemberType NoteProperty -Name "IP Address" -Value "$IPV4" -Force
$Computerinfo | Add-Member -MemberType NoteProperty -Name "OS System" -Value "$OS_System" -Force
# Filling the array with information from $Computerinfo variable.
$ArrayTable.Add($Computerinfo) | Out-Null
# Clearing of $ComputerOS variable
$ComputerOS = ""
}

#Showing Array on a screen for checking.
$ArrayTable
# Exporting Array to an Excel file.
$ArrayTable | Export-Csv C:\Scripts\output.csv
# Clearing of $ArrayTable.
$ArrayTable = ""
==End of Script==

Теперь рассмотрим процесс построения скрипта.
В любом скрипте существует главная строка, которая и делает основную работу. От нее и нужно плясать.

Здесь строка такая.
$ComputerOS = Get-ADComputer -Identity $ComputerName -Properties * | Select-Object Name,IPv4Address,OperatingSystem

Для облегчения эксперимента стоит заменить переменную $ComputerName на имя конкретного компьютера.
$ComputerOS = Get-ADComputer -Identity MyComputer -Properties * | Select-Object Name,IPv4Address,OperatingSystem

Вместо MyComputer вы, конечно же, вставите имя известного вам компьютера.
После выполнения строки вставьте переменную $ComputerOS в командную строку и полюбуйтесь результатом.


Главное сделано. Теперь вам осталось две задачи:
- применить строку к имеющемуся списку компьютеров,
- вывести результат в файл Excel.
Но об этом позже...

понедельник, 27 августа 2018 г.

Как получить системную информацию с удаленного компьютера - Windows/Linux/UNIX

Самая простая команда Windows - systeminfo.
Чтобы применить ее к удаленному компьютеру, используйте /s SERVERNAME, где SERVERNAME - имя удаленного компьютера:
systeminfo /s SERVERNAME 

Если нужно извлечь специфическую информацию, используйте | findstr /i "string", где string - часть строки с нужным свойством:
systeminfo | findstr /i "System Manufacturer"

Если же нужно получить специфическое свойство на удаленном компьютере, строка чуть усложняется и становится такой:
systeminfo /s SERVERNAME | findstr /i "System Manufacturer" 

воскресенье, 19 августа 2018 г.

Excel - заметки для чайников

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

Представьте себе, например, что перед вами стоит задача инвентаризовать парк серверов, которых у вас имеется несколько сотен. Конечно, руками это делать не очень эффективно и здесь не обойдется без PowerShell и, вероятно, PowerCLI. Возможно, вам придется сравнивать данные, полученные из различных источников при использовании различных средств работы, результаты которых надо как-то совместить, сравнить, найти одинаковые и различающиеся имена и т. д.

Все это может Excel.
Но почему я решил написать о теме, которая изъезжена вдоль и поперек, по которой существует множество книг, курсов и сайтов? Однако, в книгах приходится по крупицам искать самое ценное, в курсах та же проблема, а сайты, как правило, отвечают на запрос по конкретной функции. А ведь начинающий часто даже не знает, чем ему Excel может помочь. Ну не рыскать же по книгам и сайтам в поиске чего-то, что случайно может помочь?

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

Итак, начнем с начала.

Sort and Filter - сортировка колонок в нисходящем и восходящем порядке.
Home - Sort - Filter (в рубрике Editing).
Затем выбираете Sort A to Z или Sort Z to A.
Если нужно сортировать сразу по нескольким параметрам, выберите Custom Sort.

Remove Duplicates - удаление дубликатов в одной колонке.
Предположим, в одной колонке есть множество имен, но вам надо оставить каждое имя только один раз, чтобы оно в колонке не повторялось. Если список не слишком длинный, проще всего использовать функцию Remove Duplicates. Предварительно нужно выделить нужную колонку и затем пройти по меню:
Data - Remove Duplicates (Data Tools).
Готово! Но тут есть маленькая западня. Функция не знает, какой вариант из нескольких удалить. Если вам не все равно какую из двух Марин оставить в списке (скажем, по причине теплых чувств ;)), безопаснее использовать  функцию Duplicate Values. Она не удалит ничего, но дупликаты покажет.

Duplicate Values.
Как пользоваться функцией? Сначала  отметьте нужную колонку, а затем пройдите по меню:
Home - Conditional Formatting (в рубрике Styles) - Highlight Cell Rules - Duplicate Values.
Здесь выберите показ одного из двух вариантов или Duplicate или Unique значений. Здесь же можете выбрать приятный для вас цвет выделения. Учтите, что после операции вам не удастся легко поменять цвет выделенных ячеек.

Freeze Panes.
Следующая нужная функция - закрепление верхней или боковой строки.
Часто в больших таблицах со множеством строк приходится уходить далеко от верха таблицы и смысл значений в ячейках строк ускользает. Поэтому пользуемся "закрепителем" строк.
View - Freeze Panes (в рубрике Window) - Freeze Top Row.
Можете заморозить и первую колонку, выбрав Freeze First Column.

Filter - следующая нужная функция.
Отмечаете строку и идете в
Data - Filter (Sort and Filter).
После нажатия кнопки с воронкой получаете замечательную возможность сортировки и фильтрации данных в колонках сразу по нескольким полям. Можете, например, увидеть всех Марин определенного возраста.