1 #!powershell 2 3 # Copyright: (c) 2017, Marc Tschapek <marc.tschapek@itelligence.de> 4 # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 5 6 #Requires -Module Ansible.ModuleUtils.Legacy 7 #AnsibleRequires -OSVersion 6.2 8 9 $ErrorActionPreference = "Stop" 10 Set-StrictMode -Version 2.0 11 12 # Functions Test-Adminnull13function Test-Admin { 14 $CurrentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent()) 15 $IsAdmin = $CurrentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) 16 17 return $IsAdmin 18 } 19 20 # Check admin rights 21 if (-not (Test-Admin)) { 22 Fail-Json -obj @{} -message "Module was not started with elevated rights" 23 } 24 25 # Create a new result object 26 $result = @{ 27 changed = $false 28 ansible_facts = @{ 29 ansible_disks = @() 30 } 31 } 32 33 # Search disks 34 try { 35 $disks = Get-Disk 36 } catch { 37 Fail-Json -obj $result -message "Failed to search the disks on the target: $($_.Exception.Message)" 38 } 39 foreach ($disk in $disks) { 40 $disk_info = @{} 41 $pdisk = Get-PhysicalDisk -ErrorAction SilentlyContinue | Where-Object { 42 $_.DeviceId -eq $disk.Number 43 } 44 if ($pdisk) { 45 $disk_info["physical_disk"] += @{ 46 size = $pdisk.Size 47 allocated_size = $pdisk.AllocatedSize 48 device_id = $pdisk.DeviceId 49 friendly_name = $pdisk.FriendlyName 50 operational_status = $pdisk.OperationalStatus 51 health_status = $pdisk.HealthStatus 52 bus_type = $pdisk.BusType 53 usage_type = $pdisk.Usage 54 supported_usages = $pdisk.SupportedUsages 55 spindle_speed = $pdisk.SpindleSpeed 56 firmware_version = $pdisk.FirmwareVersion 57 physical_location = $pdisk.PhysicalLocation 58 manufacturer = $pdisk.Manufacturer 59 model = $pdisk.Model 60 can_pool = $pdisk.CanPool 61 indication_enabled = $pdisk.IsIndicationEnabled 62 partial = $pdisk.IsPartial 63 serial_number = $pdisk.SerialNumber 64 object_id = $pdisk.ObjectId 65 unique_id = $pdisk.UniqueId 66 } 67 if ([single]"$([System.Environment]::OSVersion.Version.Major).$([System.Environment]::OSVersion.Version.Minor)" -ge 6.3) { 68 $disk_info.physical_disk.media_type = $pdisk.MediaType 69 } 70 if (-not $pdisk.CanPool) { 71 $disk_info.physical_disk.cannot_pool_reason = $pdisk.CannotPoolReason 72 } 73 $vdisk = Get-VirtualDisk -PhysicalDisk $pdisk -ErrorAction SilentlyContinue 74 if ($vdisk) { 75 $disk_info["virtual_disk"] += @{ 76 size = $vdisk.Size 77 allocated_size = $vdisk.AllocatedSize 78 footprint_on_pool = $vdisk.FootprintOnPool 79 name = $vdisk.name 80 friendly_name = $vdisk.FriendlyName 81 operational_status = $vdisk.OperationalStatus 82 health_status = $vdisk.HealthStatus 83 provisioning_type = $vdisk.ProvisioningType 84 allocation_unit_size = $vdisk.AllocationUnitSize 85 media_type = $vdisk.MediaType 86 parity_layout = $vdisk.ParityLayout 87 access = $vdisk.Access 88 detached_reason = $vdisk.DetachedReason 89 write_cache_size = $vdisk.WriteCacheSize 90 fault_domain_awareness = $vdisk.FaultDomainAwareness 91 inter_leave = $vdisk.InterLeave 92 deduplication_enabled = $vdisk.IsDeduplicationEnabled 93 enclosure_aware = $vdisk.IsEnclosureAware 94 manual_attach = $vdisk.IsManualAttach 95 snapshot = $vdisk.IsSnapshot 96 tiered = $vdisk.IsTiered 97 physical_sector_size = $vdisk.PhysicalSectorSize 98 logical_sector_size = $vdisk.LogicalSectorSize 99 available_copies = $vdisk.NumberOfAvailableCopies 100 columns = $vdisk.NumberOfColumns 101 groups = $vdisk.NumberOfGroups 102 physical_disk_redundancy = $vdisk.PhysicalDiskRedundancy 103 read_cache_size = $vdisk.ReadCacheSize 104 request_no_spof = $vdisk.RequestNoSinglePointOfFailure 105 resiliency_setting_name = $vdisk.ResiliencySettingName 106 object_id = $vdisk.ObjectId 107 unique_id_format = $vdisk.UniqueIdFormat 108 unique_id = $vdisk.UniqueId 109 } 110 } 111 } 112 $disk_info.number = $disk.Number 113 $disk_info.size = $disk.Size 114 $disk_info.bus_type = $disk.BusType 115 $disk_info.friendly_name = $disk.FriendlyName 116 $disk_info.partition_style = $disk.PartitionStyle 117 $disk_info.partition_count = $disk.NumberOfPartitions 118 $disk_info.operational_status = $disk.OperationalStatus 119 $disk_info.sector_size = $disk.PhysicalSectorSize 120 $disk_info.read_only = $disk.IsReadOnly 121 $disk_info.bootable = $disk.IsBoot 122 $disk_info.system_disk = $disk.IsSystem 123 $disk_info.clustered = $disk.IsClustered 124 $disk_info.manufacturer = $disk.Manufacturer 125 $disk_info.model = $disk.Model 126 $disk_info.firmware_version = $disk.FirmwareVersion 127 $disk_info.location = $disk.Location 128 $disk_info.serial_number = $disk.SerialNumber 129 $disk_info.unique_id = $disk.UniqueId 130 $disk_info.guid = $disk.Guid 131 $disk_info.path = $disk.Path 132 $parts = Get-Partition -DiskNumber $($disk.Number) -ErrorAction SilentlyContinue 133 if ($parts) { 134 $disk_info["partitions"] += @() 135 foreach ($part in $parts) { 136 $partition_info = @{ 137 number = $part.PartitionNumber 138 size = $part.Size 139 type = $part.Type 140 drive_letter = $part.DriveLetter 141 transition_state = $part.TransitionState 142 offset = $part.Offset 143 hidden = $part.IsHidden 144 shadow_copy = $part.IsShadowCopy 145 guid = $part.Guid 146 access_paths = $part.AccessPaths 147 } 148 if ($disks.PartitionStyle -eq "GPT") { 149 $partition_info.gpt_type = $part.GptType 150 $partition_info.no_default_driveletter = $part.NoDefaultDriveLetter 151 } elseif ($disks.PartitionStyle -eq "MBR") { 152 $partition_info.mbr_type = $part.MbrType 153 $partition_info.active = $part.IsActive 154 } 155 $vols = Get-Volume -Partition $part -ErrorAction SilentlyContinue 156 if ($vols) { 157 $partition_info["volumes"] += @() 158 foreach ($vol in $vols) { 159 $volume_info = @{ 160 size = $vol.Size 161 size_remaining = $vol.SizeRemaining 162 type = $vol.FileSystem 163 label = $vol.FileSystemLabel 164 health_status = $vol.HealthStatus 165 drive_type = $vol.DriveType 166 object_id = $vol.ObjectId 167 path = $vol.Path 168 } 169 if ([System.Environment]::OSVersion.Version.Major -ge 10) { 170 $volume_info.allocation_unit_size = $vol.AllocationUnitSize 171 } else { 172 $volPath = ($vol.Path.TrimStart("\\?\")).TrimEnd("\") 173 $BlockSize = (Get-CimInstance -Query "SELECT BlockSize FROM Win32_Volume WHERE DeviceID like '%$volPath%'" -ErrorAction SilentlyContinue | Select-Object BlockSize).BlockSize 174 $volume_info.allocation_unit_size = $BlockSize 175 } 176 $partition_info.volumes += $volume_info 177 } 178 } 179 $disk_info.partitions += $partition_info 180 } 181 } 182 $result.ansible_facts.ansible_disks += $disk_info 183 } 184 185 # Return result 186 Exit-Json -obj $result 187