2016-09-19 97 views
1

this question(询问如何检索Windows产品密钥)开始,似乎存在从各种方法获得的冲突信息。这个问题问为什么它们都应该返回相同的值时有什么区别?Windows产品密钥 - 来自不同技术的不同答案

这两种方法...

POWERSHELL

(Get-WmiObject -query ‘select * from SoftwareLicensingService’).OA3xOriginalProductKey 

CMD

wmic path softwarelicensingservice get OA3xOriginalProductKey 

返回不同的结果这个VBS脚本...

Set WshShell = CreateObject("WScript.Shell") 
MsgBox ConvertToKey(WshShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId")) 

Function ConvertToKey(Key) 
    Const KeyOffset = 52 
    i = 28 
    Chars = "BCDFGHJKMPQRTVWXY2346789" 
    Do 
     Cur = 0 
     x = 14 
     Do 
      Cur = Cur * 256 
      Cur = Key(x + KeyOffset) + Cur 
      Key(x + KeyOffset) = (Cur \ 24) And 255 
      Cur = Cur Mod 24 
      x = x - 1 
     Loop While x >= 0 
     i = i - 1 
     KeyOutput = Mid(Chars, Cur + 1, 1) & KeyOutput 
     If (((29 - i) Mod 6) = 0) And (i <> -1) Then 
      i = i - 1 
      KeyOutput = "-" & KeyOutput 
     End If 
    Loop While i >= 0 
    ConvertToKey = KeyOutput 
End Function 

PowerShell和CMD同意彼此,但VBS脚本显示不同的值。

任何想法,为什么这可能是?


更新 - 几乎那里!

以下PowerShell脚本获取与PowerShell和Cmd命令相同的产品密钥。看来,一些在值的编码方式已经改变(我已经没有时间,以确定哪些变化是还)

function Get-ProductKey { 
    <# 
    .SYNOPSIS 
     Retrieves the product key and OS information from a local or remote system/s. 

    .Description 
     Retrieves the product key and OS information from a local or remote system/s. Queries of 64bit OS from a 32bit OS will result in 
     inaccurate data being returned for the Product Key. You must query a 64bit OS from a system running a 64bit OS. 

    .Parameter ComputerName 
     Name of the local or remote system/s. 

    .Notes 
Author:    Boe Prox 
     Version: 1.1 
      -Update of function from http://powershell.com/cs/blogs/tips/archive/2012/04/30/getting-windows-product-key.aspx 
      -Added capability to query more than one system 
      -Supports remote system query 
      -Supports querying 64bit OSes 
      -Shows OS description and Version in output object 
      -Error Handling 

    .EXAMPLE 
    Get-ProductKey -Computername Server1 

    OSDescription           Computername OSVersion ProductKey 
    -------------           ------------ --------- ---------- 
    Microsoft(R) Windows(R) Server 2003, Enterprise Edition Server1  5.2.3790 bcdfg-hjklm-pqrtt-vwxyy-12345 

     Description 
     ----------- 
     Retrieves the product key information from 'Server1' 
    #> 
    [cmdletbinding()] 
    Param (
     [parameter(ValueFromPipeLine=$True,ValueFromPipeLineByPropertyName=$True)] 
     [Alias("CN","__Server","IPAddress","Server")] 
     [string[]]$Computername = $Env:Computername 
    ) 
    Begin { 
     $map="BCDFGHJKMPQRTVWXY2346789" 
    } 
    Process { 
     ForEach ($Computer in $Computername) { 
      Write-Verbose ("{0}: Checking network availability" -f $Computer) 
      If (Test-Connection -ComputerName $Computer -Count 1 -Quiet) { 
       Try { 
        Write-Verbose ("{0}: Retrieving WMI OS information" -f $Computer) 
        $OS = Get-WmiObject -ComputerName $Computer Win32_OperatingSystem -ErrorAction Stop 
       } Catch { 
        $OS = New-Object PSObject -Property @{ 
         Caption = $_.Exception.Message 
         Version = $_.Exception.Message 
        } 
       } 
       Try { 
      Write-Verbose ("{0}: Attempting remote registry access" -f $Computer) 
      $remoteReg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$Computer) 
      $value = $remoteReg.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue('DigitalProductId')[0x34..0x42] 
      $isWin8OrNewer = [math]::Floor(($value[14]/6)) -band 1 
      $value[14] = ($value[14] -band 0xF7) -bor (($isWin8OrNewer -band 2) * 4) 
      $ProductKey = "" 
      Write-Verbose ("{0}: Translating data into product key" -f $Computer) 
      for ($i = 24; $i -ge 0; $i--) { 
       $r = 0 
       for ($j = 14; $j -ge 0; $j--) { 
       $r = ($r * 256) -bxor $value[$j] 
       $value[$j] = [math]::Floor([double]($r/24)) 
       $r = $r % 24 
       } 
       $ProductKey = $map[$r] + $ProductKey 
      } 
     } Catch { 
      $ProductKey = $_.Exception.Message 
     } 

     if ($isWin8OrNewer){ 
      $ProductKey = $ProductKey.Remove(0, 1) 
      $ProductKey = $ProductKey.Insert($r, 'N') 
     } 

     #insert dashes to make key more readable 
     for($i = 5; $i -lt 29; $i = $i + 6){ 
      $ProductKey = $ProductKey.Insert($i, '-') 
     } 
       $object = New-Object PSObject -Property @{ 
        Computername = $Computer 
        ProductKey = $ProductKey 
        OSDescription = $os.Caption 
        OSVersion = $os.Version 
       } 
       $object.pstypenames.insert(0,'ProductKey.Info') 
       $object 
      } Else { 
       $object = New-Object PSObject -Property @{ 
        Computername = $Computer 
        ProductKey = 'Unreachable' 
        OSDescription = 'Unreachable' 
        OSVersion = 'Unreachable' 
       } 
       $object.pstypenames.insert(0,'ProductKey.Info') 
       $object 
      } 
     } 
    } 
} 

上述脚本是从here拍摄,但考虑到修改建议由TJ在2016年2月5日底部的评论中发现。那个人是传奇!那么,原作者也清楚!

当我创建它时,我会发布VB版本,假设这个问题没有被关闭(只需要3张票,所以迅速采取行动)/讽刺。

+1

因为两种方法都使用不同的位置来查找密钥。你已经[已经发布了这个](http://stackoverflow.com/q/39530254/692942)为什么要创建一个新的问题? – Lankymart

+0

我写了更新3:0)当然,每个窗口副本只有一个windows产品密钥,因此我为什么会得到不同的答案而感到困惑! VBS脚本已被预告,过去称赞为检索有效的Windows产品密钥,为什么它现在停止工作? –

+0

这是一个单独的问题,很明显!哦,你现在改变了你的评论,你看到我是另一个问题的作者。我的第一个问题是关于检索产品密钥,这个问题是为什么我得到不同的结果。 –

回答

0

在我测试的Windows 7和Windows 10系统上不存在HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId。但是VBScript仍然会输出一个值而不是抛出错误。

你可能会寻找这个值,而不是在Windows 7:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DefaultProductKey\DigitalProductId(注意:不能在Windows 10中存在)

+0

'HKLM'实际上是'HKEY_LOCAL_MACHINE'的别名... http://superuser.com/questions/822518/is-hklm-an-alias-for-hkey-local-machine –

+0

是的......我的错误在于不一致。我显示的差异是'DigitalProductId'和'DefaultProductKey \ DigitalProductId'之间的差异 – BenH

+0

:0)感谢澄清...我甚至没有注意到'DefaultProductKey'隐藏在第二个路径! –

0

根据this article WMI查询将返回存储在BIOS中的OEM密钥或制造商提供的UEFI固件。从注册表中读取的VBScript方法将返回在用户设置期间(或之后)输入的零售产品密钥。

+0

我没有在我的机器上输入不同的密钥!因此,我希望所有三种方法的结果相同......也许它与64位键值有关,而VBS方法使用32位值?!我真的不知道,信息似乎有点稀缺。 –