Заметки IT Менеджера

22.05.2012

Получение ключа установки Windows с помощью PowerShell


Обновлено 22.05.2012 – спасибо pan_2@LJ за наводку на более совершенную версию скрипта
powershell_21 Эта функция может пригодиться для инвентаризации или других подобных случаев.

function Calculate-ProductKey {

param ($rpk)

 

    if ($rpk)#if rpk present - do math

    {

    $i = 28

    $rpkOffset = 52

    $PossibleChars = "BCDFGHJKMPQRTVWXY2346789"

    do {

        $Accumulator = 0

        $j = 14

        do {

            $Accumulator = $Accumulator * 256

            $Accumulator = $rpk[$j + $rpkOffset] + $Accumulator

            $Accumulator / 24 -match "^\d*" | Out-Null

            $rpk[$j + $rpkOffset] = $matches[0] -band 255

            $Accumulator = $Accumulator % 24

            $j--

            } while ($j -ge 0)

        $i--

        $ProductKey = $PossibleChars.Substring($Accumulator, 1) + $ProductKey

        if ((29 - $i) % 6 -eq 0 -and $i -ne -1) {

            $i--

            $ProductKey = "-" + $ProductKey

        }

    } while ($i -ge 0)

    $ProductKey

    }

    else

    { "Not Available" }

}

 

 

function Get-RegistryValues {

param ($strcomputer)

 

    #create object for output

    $object = new-object psobject

    #create wmi object

    $wmi2 = "\\"+$strComputer+"\root\default:stdRegProv"

    $wmi = [wmiclass]$wmi2

    

    #get IE version

    $hklm = 2147483650

    $key = "SOFTWARE\Microsoft\Internet Explorer\"

    $value = "Version"

    $IEVersion = ($wmi.GetStringValue($hklm,$key,$value)).sValue

    $object | add-member noteproperty IEVer ($IEVersion)

    

    #get windows product key

    $key = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\"

    $value = "DigitalProductId"

    $WinPK = ($wmi.GetBinaryValue($hklm,$key,$value)).uValue

    $WinPK = Calculate-ProductKey $WinPK

    $object | add-member noteproperty WindowsProductKey ($WinPK)

 

    #get shell

    $key = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\"

    $value = "Shell"

    $WindowsShell = ($wmi.GetStringValue($hklm,$key,$value)).sValue

    $object | add-member noteproperty WindowsShell ($WindowsShell)

    

    #get userinit

    $key = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\"

    $value = "Userinit"

    $UserInit = ($wmi.GetStringValue($hklm,$key,$value)).sValue

    $object | add-member noteproperty UserInit ($UserInit)

 

    #get automatic updates status

    $key = "SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\"

    $value = "NoAutoUpdate"

    $NoAutoUpdate = ($wmi.GetDWORDValue($hklm,$key,$value)).uValue

    $object | add-member noteproperty NoAutoUpdate ($NoAutoUpdate)

    $value = "AUOptions"

    $AUOptions = ($wmi.GetDWORDValue($hklm,$key,$value)).uValue

    $object | add-member noteproperty AUOptions ($AUOptions)

 

    

    #return object

    $object

}

Использование:

Get-RegistryValues [computername]

Например,

Get-RegistryValues . (получить данные локального компьютера)

Или:

Get-RegistryValues CompName (Получить данные компьютера с именем CompName)

  Взято здесь
Реклама

8 комментариев »

  1. Херня.
    Вот, работает на любой ОС, может таскать значения по сети.
    function Calculate-ProductKey {
    param ($rpk)

    if ($rpk)#if rpk present — do math
    {
    $i = 28
    $rpkOffset = 52
    $PossibleChars = «BCDFGHJKMPQRTVWXY2346789»
    do {
    $Accumulator = 0
    $j = 14
    do {
    $Accumulator = $Accumulator * 256
    $Accumulator = $rpk[$j + $rpkOffset] + $Accumulator
    $Accumulator / 24 -match «^\d*» | Out-Null
    $rpk[$j + $rpkOffset] = $matches[0] -band 255
    $Accumulator = $Accumulator % 24
    $j—
    } while ($j -ge 0)
    $i—
    $ProductKey = $PossibleChars.Substring($Accumulator, 1) + $ProductKey
    if ((29 — $i) % 6 -eq 0 -and $i -ne -1) {
    $i—
    $ProductKey = «-» + $ProductKey
    }
    } while ($i -ge 0)
    $ProductKey
    }
    else
    { «Not Available» }
    }

    function Get-RegistryValues {
    param ($strcomputer)

    #create object for output
    $object = new-object psobject
    #create wmi object
    $wmi2 = «\\»+$strComputer+»\root\default:stdRegProv»
    $wmi = [wmiclass]$wmi2

    #get IE version
    $hklm = 2147483650
    $key = «SOFTWARE\Microsoft\Internet Explorer\»
    $value = «Version»
    $IEVersion = ($wmi.GetStringValue($hklm,$key,$value)).sValue
    $object | add-member noteproperty IEVer ($IEVersion)

    #get windows product key
    $key = «SOFTWARE\Microsoft\Windows NT\CurrentVersion\»
    $value = «DigitalProductId»
    $WinPK = ($wmi.GetBinaryValue($hklm,$key,$value)).uValue
    $WinPK = Calculate-ProductKey $WinPK
    $object | add-member noteproperty WindowsProductKey ($WinPK)

    #get shell
    $key = «SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\»
    $value = «Shell»
    $WindowsShell = ($wmi.GetStringValue($hklm,$key,$value)).sValue
    $object | add-member noteproperty WindowsShell ($WindowsShell)

    #get userinit
    $key = «SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\»
    $value = «Userinit»
    $UserInit = ($wmi.GetStringValue($hklm,$key,$value)).sValue
    $object | add-member noteproperty UserInit ($UserInit)

    #get automatic updates status
    $key = «SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\»
    $value = «NoAutoUpdate»
    $NoAutoUpdate = ($wmi.GetDWORDValue($hklm,$key,$value)).uValue
    $object | add-member noteproperty NoAutoUpdate ($NoAutoUpdate)
    $value = «AUOptions»
    $AUOptions = ($wmi.GetDWORDValue($hklm,$key,$value)).uValue
    $object | add-member noteproperty AUOptions ($AUOptions)

    #return object
    $object
    }

    # Usage:
    #
    # Get-RegistryValues [computername]
    # For ex.: Get-RegistryValues . (get values from local machine)
    # For ex.: Get-RegistryValues SUPERSERVER (get values from SUPERSERVER machine)

    комментарий от pan_2@LJ — 22.05.2012 @ 12:38 | Ответить

    • Этот вариант, действительно лучше. Заменил. Спасибо! :-)

      комментарий от itpadla — 22.05.2012 @ 13:16 | Ответить

  2. Парсер лох, вот на пастебине http://pastebin.com/Ta4nzddt

    комментарий от pan_2@LJ — 22.05.2012 @ 12:40 | Ответить

  3. Вот тебе ещё: Script to display last password change of computer accounts in Active Directory: http://pastebin.com/3P3WxzYh
    Т.е. все аккаунты что старше 1,5 месяца — уже не актуальны (или это ноуты в командировке :)

    И ещё: Get-MyExternalIp http://pastebin.com/RJfyAH0V

    комментарий от pan_2@LJ — 22.05.2012 @ 13:31 | Ответить

    • Про компы у меня есть, есть еще и такое: http://wp.me/pCU2B-1Q. Правда, актуальность этого скрипта уже низка, т.к. с переходом на Windows 7 случаев отвалившегося WSUS совсем или почти не было.
      В любом случае — спасибо!

      комментарий от itpadla — 22.05.2012 @ 13:57 | Ответить

  4. Здравствуйте, очень нравится ваш блог!
    Не намылите ли мне рил нейм, хотел вас в блоги правильных авторов на своем http://fromreallife.wordpress.com/ прикрепить, с вашего разрешения.
    drazbornovСобакоgmail.com
    спасибо

    комментарий от razbornovd — 27.05.2012 @ 13:35 | Ответить

  5. Добрый день!

    Ctrl + C CTrl + V вашего скрипта не работает

    Либо выкладывайте оригинал в файлике, приложенном к посту, либо делайте так, чтобы wordpress не подменял кавычки и другие знаки

    комментарий от Баф — 06.06.2012 @ 08:58 | Ответить

    • Спасибо за замечание, исправил.

      комментарий от itpadla — 06.06.2012 @ 09:57 | Ответить


RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Создайте бесплатный сайт или блог на WordPress.com.

%d такие блоггеры, как: