2011-12-27 132 views
1

你好問題回答精彩的人!VB.NET - 檢查Windows許可證狀態或正版Windows

我想找到一種方法來準確驗證Windows 7機器當前是否正在使用活動許可證並已激活。我相信我可以啓動'cmd.exe'命令來運行cscript(slmgr)並解析該信息,但這似乎是一種效率低下的方法。

我遇到了一個名爲SLGetGenuineInformation(http://msdn.microsoft.com/en-us/library/windows/desktop/bb648650%28v=vs.85%29.aspx)的非託管窗口API,但我不熟悉如何在VB.NET中調用它或變量類型應該是什麼。我相信VB6附帶了Visual Studio 2010似乎沒有包含的某種APIViewer。

所有相關的Google搜索都會顯示爲不相關的結果。

有關如何進行或完成此目標的任何建議,建議或指導?

+0

這裏有一個C#示例http://stackoverflow.com/questions/1552392/determine-genuine-windows-installation-in-c-sharp – RRUZ 2011-12-27 17:02:37

回答

0

如果有幫助,這是VC++例子

#include <slpublic.h> 
#pragma comment(lib,"Slwga.lib") 

bool IsWindowsGenuine() 
{ 
    GUID uid; 
    RPC_WSTR rpc=(RPC_WSTR)_T("55c92734-d682-4d71-983e-d6ec3f16059f"); 
    UuidFromString(rpc,&uid); 
    SL_GENUINE_STATE state; 
    SLIsGenuineLocal(&uid,&state,NULL); 
    if(state==SL_GENUINE_STATE::SL_GEN_STATE_IS_GENUINE) 
     return true; 
    return false; 
} 

這裏是VB Sript,做它:

trComputer = "." 
Set objWMIService = GetObject("winmgmts:" _ 
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colWPA = objWMIService.ExecQuery _ 
("Select * from Win32_WindowsProductActivation") 
For Each objWPA in colWPA 
Wscript.Echo "Activation Required: " & objWPA.ActivationRequired 
Wscript.Echo "Description: " & objWPA.Description 
Wscript.Echo "Product ID: " & objWPA.ProductID 
Wscript.Echo "Remaining Evaluation Period: " & _ 
objWPA.RemainingEvaluationPeriod 
Wscript.Echo "Remaining Grace Period: " & objWPA.RemainingGracePeriod 
Wscript.Echo "Server Name: " & objWPA.ServerName 
Next 

來源:How to check if a Windows version is Genuine or not?

如果您想直接從OS寄存器中讀取你可以閱讀使用VB工作惠特在這裏註冊:http://www.codeproject.com/KB/vb/registry_with_vb.aspx

+0

Acualy它可以被翻譯並有5個主題在這包括如何在VB.NET中執行此代碼1示例http://stackoverflow.com/questions/7545206/how-to-check-if-a-windows-version-is-genuine-or-not 它已經討論過了。如果沒有別的,他總是可以引用Windows註冊表並從那裏讀取信息。 – 2011-12-27 17:04:29

+0

這似乎是VBScript,但它顯示了一個使用WMI的例子,我可以試試看看我是否能夠獲得有希望的結果。不幸的是,你所說的註冊表值並不在這個鏈接中,但我之前已經看到過。問題在於該值看起來不準確和/或不穩定,因爲我查看了具有不同結果的同一版本的許多不同機器上的值。 – Zachet 2011-12-27 17:14:12

+0

VBScript不是VB.NET;它們與Java和JavaScript相關。查看@ RRUZ的答案,其實是與VB.NET相關的。 – 2011-12-27 18:15:17

2

檢查此示例vb.net控制檯應用程序,它使用SLIsGenuineLocal函數。

Imports System.Collections.Generic 
Imports System.Text 
Imports System.Runtime.InteropServices 
Imports SLID = System.Guid 
Module Module1 

    Public Enum SL_GENUINE_STATE 
     SL_GEN_STATE_IS_GENUINE = 0 
     SL_GEN_STATE_INVALID_LICENSE = 1 
     SL_GEN_STATE_TAMPERED = 2 
     SL_GEN_STATE_LAST = 3 
    End Enum 

    <DllImportAttribute("Slwga.dll", EntryPoint:="SLIsGenuineLocal", CharSet:=CharSet.None, ExactSpelling:=False, SetLastError:=False, PreserveSig:=True, CallingConvention:=CallingConvention.Winapi, _ 
    BestFitMapping:=False, ThrowOnUnmappableChar:=False)> _ 
    <PreserveSigAttribute()> _ 
    Friend Function SLIsGenuineLocal(ByRef slid As SLID, <[In](), Out()> ByRef genuineState As SL_GENUINE_STATE, ByVal val3 As IntPtr) As UInteger 
    End Function 


    Public Function IsGenuineWindows() As Boolean 
     Dim _IsGenuineWindows As Boolean = False 
     Dim ApplicationID As New Guid("55c92734-d682-4d71-983e-d6ec3f16059f") 
     'Application ID GUID http://technet.microsoft.com/en-us/library/dd772270.aspx 
     Dim windowsSlid As SLID = CType(ApplicationID, Guid) 
     Try 
      Dim genuineState As SL_GENUINE_STATE = SL_GENUINE_STATE.SL_GEN_STATE_LAST 
      Dim ResultInt As UInteger = SLIsGenuineLocal(windowsSlid, genuineState, IntPtr.Zero) 
      If ResultInt = 0 Then 
       _IsGenuineWindows = (genuineState = SL_GENUINE_STATE.SL_GEN_STATE_IS_GENUINE) 
      Else 
       Console.WriteLine("Error getting information {0}", ResultInt.ToString()) 

      End If 
     Catch ex As Exception 
      Console.WriteLine(ex.Message) 
     End Try 
     Return _IsGenuineWindows 
    End Function 

    Sub Main() 
     If Environment.OSVersion.Version.Major >= 6 Then 
      'Version 6 can be Windows Vista, Windows Server 2008, or Windows 7 
      If IsGenuineWindows() Then 
       Console.WriteLine("Original Windows") 
      Else 
       Console.WriteLine("Not Original Windows") 
      End If 
     Else 
      Console.WriteLine("OS Not supoprted") 
     End If 
     Console.ReadLine() 
    End Sub 

End Module 
+0

不幸的是,這似乎是一個有效的機器沒有激活,因爲重新裝備,我沒有測試過一個全新的安裝,沒有輸入任何密鑰。我認爲它正在按預期工作,只是確切的功能不符合我想要的。我會嘗試以此爲例,並將其用於另一個類似的功能。謝謝! – Zachet 2011-12-27 19:21:15