V předchozím zaměstnání byla naprostou prioritou bezpečnost. Pracovali jsme tak s izolovanými ostrůvky domén, které byly ze všech stran obehnány firewally. Jako SPLA provider jsme využívali vždy poslední, maximálně předposlední verze všech MS produktů. Oproti tomu v současné firmě se jedná o globální Active Directory forest, se spoustou stromů. Zároveň jsou používány rozličné verze produktů, od nejnovějších i po ty, které jsou těsně před koncem podpory, je nutné poskytovat funkčnost MAC OS X a dalším Apple produktům. Takže je pravda, že se musím učit spoustu nových věcí. Například dnes jsem potřeboval najít nejsnazší způsob, jak zjistit, zdali je nějaký doménový server v LatAm virtuální nebo fyzický.
Jelikož se používají W2003-W2012, u W2003 a W2008 může jít i o x86 systémy, nelze spoléhat na nainstalovaný PowerShell (jakékoliv verze), zjistil jsem, že nejlepším, nejjednodušším řešením je WMI. Konzoli WMI, resp. wmic.exe má snad každý systém od dob WXP, W2003. Díky funkčnímu forestu nemusím řešit autentizaci/autorizaci a koneckonců ani firewall prostupy, protože se pohybuji po vnitřní síti, kde jsou lokality propojeny VPN tunely.
Zpět ke zjištění, zdali je vzdálený počítač virtuálem. V předchozím zaměstnání jsme si identifikaci usnadnili vhodným pojmenováním serveru. Tady je však prioritou v názvu serveru určit lokalitu, v níž se server nachází, poté určení toho serveru a v případě kolize s jiným jménem též číselný identifikátor. Suma sumárum informace o tom, zdali se jedná o virtuál či fyzický stroj, se již do názvu nedostala, nehledě na to, že v rozšiřujícím se počtu P2V či V2V migrací by to stejně ztratilo smysl. Mohl bych totiž chtít rozlišovat, jestli tento virtuál běží pod Hyper-V, ESX či KVM atd. Zjištění tak musí být provedeno ad-hoc.
Vytvořil jsem si jednoduchý baťáček nazvaný getHW,cmd. Obsahuje:
@echo off
rem %1 is server FQDN
rem USAGE: getHW.cmd FQDN
wmic /NODE:"%1" computersystem get Manufacturer, Model
V případě, že bych chtěl tuto informaci získat z nedoménového počítače, musím přidat ještě parametr /USER:domena\uzivatel.
Když jsem se po delší době opět k WMI dostal, tak mi to nedalo, abych se nepodíval, co dalšího zajímavého by se takto dalo zjišťovat – a našel jsem výborný článek na Ask the Performance Team Blogu – Useful WMIC Queries. Jelikož se mi už mnohokrát stalo, že užitečné informace z uloženého linku zmizely při naprosto nepochopitelném redesignu odkazovaného webu, tak tentokráte nehodlám riskovat a i když se to nemá, tak tu tabulku prostě sprostě ukradnu.
baseboard | get Manufacturer, Model, Name, PartNumber, slotlayout, serialnumber, poweredon |
bios | get name, version, serialnumber |
bootconfig | get BootDirectory, Caption, TempDirectory, Lastdrive |
cdrom | get Name, Drive, Volumename |
computersystem | get Name, domain, Manufacturer, Model, NumberofProcessors, PrimaryOwnerName,Username, Roles, totalphysicalmemory /format:list |
cpu | get Name, Caption, MaxClockSpeed, DeviceID, status |
datafile | where name='c:\\boot.ini' get Archive, FileSize, FileType, InstallDate, Readable, Writeable, System, Version |
dcomapp | get Name, AppID /format:list |
desktop | get Name, ScreenSaverExecutable, ScreenSaverActive, Wallpaper /format:list |
desktopmonitor | get screenheight, screenwidth |
diskdrive | get Name, Manufacturer, Model, InterfaceType, MediaLoaded, MediaType |
diskquota | get User, Warninglimit, DiskSpaceUsed, QuotaVolume |
environment | get Description, VariableValue |
fsdir | where name='c:\\windows' get Archive, CreationDate, LastModified, Readable, Writeable, System, Hidden, Status |
group | get Caption, InstallDate, LocalAccount, Domain, SID, Status |
idecontroller | get Name, Manufacturer, DeviceID, Status |
irq | get Name, Status |
job | get Name, Owner, DaysOfMonth, DaysOfWeek, ElapsedTime, JobStatus, StartTime, Status |
loadorder | get Name, DriverEnabled, GroupOrder, Status |
logicaldisk | get Name, Compressed, Description, DriveType, FileSystem, FreeSpace, SupportsDiskQuotas, VolumeDirty, VolumeName |
memcache | get Name, BlockSize, Purpose, MaxCacheSize, Status |
memlogical | get AvailableVirtualMemory, TotalPageFileSpace, TotalPhysicalMemory, TotalVirtualMemory |
memorychip | get BankLabel, Capacity, Caption, CreationClassName, DataWidth, Description, Devicelocator, FormFactor, HotSwappable, InstallDate, InterleaveDataDepth, InterleavePosition, Manufacturer, MemoryType, Model, Name, OtherIdentifyingInfo, PartNumber, PositionInRow, PoweredOn, Removable, Replaceable, SerialNumber, SKU, Speed, Status, Tag, TotalWidth, TypeDetail, Version |
memphysical | get Manufacturer, Model, SerialNumber, MaxCapacity, MemoryDevices |
netclient | get Caption, Name, Manufacturer, Status |
netlogin | get Name, Fullname, ScriptPath, Profile, UserID, NumberOfLogons, PasswordAge, LogonServer, HomeDirectory, PrimaryGroupID |
netprotocol | get Caption, Description, GuaranteesSequencing, SupportsBroadcasting, SupportsEncryption, Status |
netuse | get Caption, DisplayType, LocalName, Name, ProviderName, Status |
nic | get AdapterType, AutoSense, Name, Installed, MACAddress, PNPDeviceID,PowerManagementSupported, Speed, StatusInfo |
nicconfig | get MACAddress, DefaultIPGateway, IPAddress, IPSubnet, DNSHostName, DNSDomain |
nicconfig | get MACAddress, IPAddress, DHCPEnabled, DHCPLeaseExpires, DHCPLeaseObtained, DHCPServer |
nicconfig | get MACAddress, IPAddress, DNSHostName, DNSDomain, DNSDomainSuffixSearchOrder, DNSEnabledForWINSResolution, DNSServerSearchOrder |
nicconfig | get MACAddress, IPAddress, WINSPrimaryServer, WINSSecondaryServer, WINSEnableLMHostsLookup, WINSHostLookupFile |
ntdomain | get Caption, ClientSiteName, DomainControllerAddress, DomainControllerName, Roles, Status |
ntevent | where (LogFile='system' and SourceName='W32Time') get Message, TimeGenerated |
ntevent | where (LogFile='system' and SourceName='W32Time' and Message like '%timesource%') get Message, TimeGenerated |
ntevent | where (LogFile='system' and SourceName='W32Time' and EventCode!='29') get TimeGenerated, EventCode, Message |
onboarddevice | get Description, DeviceType, Enabled, Status |
os | get Version, Caption, CountryCode, CSName, Description, InstallDate, SerialNumber, ServicePackMajorVersion, WindowsDirectory /format:list |
os | get CurrentTimeZone, FreePhysicalMemory, FreeVirtualMemory, LastBootUpTime, NumberofProcesses, NumberofUsers, Organization, RegisteredUser, Status |
pagefile | get Caption, CurrentUsage, Status, TempPageFile |
pagefileset | get Name, InitialSize, MaximumSize |
partition | get Caption, Size, PrimaryPartition, Status, Type |
printer | get DeviceID, DriverName, Hidden, Name, PortName, PowerManagementSupported, PrintJobDataType, VerticalResolution, Horizontalresolution |
printjob | get Description, Document, ElapsedTime, HostPrintQueue, JobID, JobStatus, Name, Notify, Owner, TimeSubmitted, TotalPages |
process | get Caption, CommandLine, Handle, HandleCount, PageFaults, PageFileUsage, PArentProcessId, ProcessId, ThreadCount |
product | get Description, InstallDate, Name, Vendor, Version |
qfe | get description, FixComments, HotFixID, InstalledBy, InstalledOn, ServicePackInEffect |
quotasetting | get Caption, DefaultLimit, Description, DefaultWarningLimit, SettingID, State |
recoveros | get AutoReboot, DebugFilePath, WriteDebugInfo, WriteToSystemLog |
Registry | get CurrentSize, MaximumSize, ProposedSize, Status |
scsicontroller | get Caption, DeviceID, Manufacturer, PNPDeviceID |
server | get ErrorsAccessPermissions, ErrorsGrantedAccess, ErrorsLogon, ErrorsSystem, FilesOpen, FileDirectorySearches |
service | get Name, Caption, State, ServiceType, StartMode, pathname |
share | get name, path, status |
sounddev | get Caption, DeviceID, PNPDeviceID, Manufacturer, status |
startup | get Caption, Location, Command |
sysaccount | get Caption, Domain, Name, SID, SIDType, Status |
sysdriver | get Caption, Name, PathName, ServiceType, State, Status |
systemenclosure | get Caption, Height, Depth, Manufacturer, Model, SMBIOSAssetTag, AudibleAlarm, SecurityStatus, SecurityBreach, PoweredOn, NumberOfPowerCords |
systemslot | get Number, SlotDesignation, Status, SupportsHotPlug, Version, CurrentUsage, ConnectorPinout |
tapedrive | get Name, Capabilities, Compression, Description, MediaType, NeedsCleaning, Status, StatusInfo |
timezone | get Caption, Bias, DaylightBias, DaylightName, StandardName |
useraccount | get AccountType, Description, Domain, Disabled, LocalAccount, Lockout, PasswordChangeable, PasswordExpires, PasswordRequired, SID |
Zdroj: http://blogs.technet.com/b/askperf/archive/2012/02/17/useful-wmic-queries.aspx