diff --git a/lib/ansible/modules/windows/win_product_facts.ps1 b/lib/ansible/modules/windows/win_product_facts.ps1 new file mode 100644 index 00000000000..c727afc2ef5 --- /dev/null +++ b/lib/ansible/modules/windows/win_product_facts.ps1 @@ -0,0 +1,67 @@ +#!powershell +# This file is part of Ansible + +# Copyright: (c) 2017, Dag Wieers (dagwieers) +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +#Requires -Module Ansible.ModuleUtils.Legacy + +$ErrorActionPreference = "Stop" + +$params = Parse-Args -arguments $args -supports_check_mode $true + +$result = @{ + changed = $false + ansible_facts = @{ + ansible_os_product_id = (Get-CimInstance Win32_OperatingSystem).SerialNumber + } +} + +# First try to find the product key from ACPI +try { + $product_key = (Get-CimInstance -Class SoftwareLicensingService).OA3xOriginalProductKey +} catch { + $product_key = $null +} + +if (-not $product_key) { + # Else try to get it from the registry instead + try { + $data = Get-ItemPropertyValue -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion" -Name DigitalProductId + } catch { + $data = $null + } + + # And for Windows 2008 R2 + if (-not $data) { + try { + $data = Get-ItemPropertyValue -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion" -Name DigitalProductId4 + } catch { + $data = $null + } + } + + if ($data) { + $product_key = $null + $hexdata = $data[52..66] + $chardata = "B","C","D","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","6","7","8","9" + + # Decode base24 binary data + for ($i = 24; $i -ge 0; $i--) { + $k = 0 + for ($j = 14; $j -ge 0; $j--) { + $k = $k * 256 -bxor $hexdata[$j] + $hexdata[$j] = [math]::truncate($k / 24) + $k = $k % 24 + } + $product_key = $chardata[$k] + $product_key + if (($i % 5 -eq 0) -and ($i -ne 0)) { + $product_key = "-" + $product_key + } + } + } +} + +$result.ansible_facts.ansible_os_product_key = $product_key + +Exit-Json -obj $result diff --git a/lib/ansible/modules/windows/win_product_facts.py b/lib/ansible/modules/windows/win_product_facts.py new file mode 100644 index 00000000000..c2f7c0d746f --- /dev/null +++ b/lib/ansible/modules/windows/win_product_facts.py @@ -0,0 +1,36 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright: (c) 2017, Dag Wieers (dagwieers) +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ['preview'], + 'supported_by': 'community'} + +DOCUMENTATION = ''' +--- +module: win_product_facts +short_description: Provides Windows product information (product id, product key) +description: +- Provides Windows product information. +version_added: '2.5' +author: +- Dag Wieers (@dagwieers) +options: {} +''' + +EXAMPLES = r''' +- name: Get product id and product key + win_product_facts: +''' + +RETURN = ''' +ansible_facts: + description: returned facts by this module + returned: always + type: dictionary + sample: + ansible_os_product_id: 00326-10000-00000-AA698 + ansible_os_product_key: T49TD-6VFBW-VV7HY-B2PXY-MY47H +''' diff --git a/test/integration/targets/win_product_facts/aliases b/test/integration/targets/win_product_facts/aliases new file mode 100644 index 00000000000..c6d61981670 --- /dev/null +++ b/test/integration/targets/win_product_facts/aliases @@ -0,0 +1 @@ +windows/ci/group3 diff --git a/test/integration/targets/win_product_facts/tasks/main.yml b/test/integration/targets/win_product_facts/tasks/main.yml new file mode 100644 index 00000000000..b1427eeaa15 --- /dev/null +++ b/test/integration/targets/win_product_facts/tasks/main.yml @@ -0,0 +1,11 @@ +# This file is part of Ansible + +# Copyright: (c) 2017, Dag Wieers (dagwieers) +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +- win_product_facts: + +- assert: + that: + - ansible_os_product_id is defined + - ansible_os_product_key is defined