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-Adminnull13 function 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