VB.NET-检查Windows许可证状态或正版Windows

VB.NET-检查Windows许可证状态或正版Windows,windows,vb.net,winapi,Windows,Vb.net,Winapi,你好,令人敬畏的答疑人 我试图找到一种方法来准确地验证Windows 7计算机当前是否正在使用活动许可证并处于激活状态。我相信我可以启动“cmd.exe”命令来运行cscript(slmgr)并解析该信息,但这似乎是一种低效的方法 我遇到了一个名为SLGetGenuineInformation()的非托管windows API,但是我不熟悉如何在VB.NET中调用它,也不知道变量类型应该是什么。我相信VB6附带了某种APIViewer,VisualStudio2010似乎不包含这种API 所有相

你好,令人敬畏的答疑人

我试图找到一种方法来准确地验证Windows 7计算机当前是否正在使用活动许可证并处于激活状态。我相信我可以启动“cmd.exe”命令来运行cscript(slmgr)并解析该信息,但这似乎是一种低效的方法

我遇到了一个名为SLGetGenuineInformation()的非托管windows API,但是我不熟悉如何在VB.NET中调用它,也不知道变量类型应该是什么。我相信VB6附带了某种APIViewer,VisualStudio2010似乎不包含这种API

所有相关的谷歌搜索结果都是不相关的


关于如何继续或实现此目标,有任何建议、建议或指导吗?

如果有帮助,这是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与注册表一起工作时在此处阅读:

检查此使用此函数的示例VB.net控制台应用程序

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
导入System.Collections.Generic
导入系统文本
导入System.Runtime.InteropServices
Imports=System.Guid
模块1
公共枚举SL_真实状态
SL_GEN_STATE_是真正的=0
SL_GEN_STATE_无效_许可证=1
SL_GEN_STATE_tamped=2
SL_GEN_STATE_LAST=3
结束枚举
_
_
友元函数SLIsGenuineLocal(ByRef滑动为Slide,ByRef TruineState为SL_True_状态,ByVal val3为IntPtr)作为UInteger
端函数
公共函数IsGenuineWindows()为布尔值
Dim\u IsGenuineWindows作为布尔值=False
Dim应用程序ID作为新Guid(“55c92734-d682-4d71-983e-d6ec3f16059f”)
'应用程序ID GUIDhttp://technet.microsoft.com/en-us/library/dd772270.aspx
Dim windowslided As slided=CType(应用程序ID,Guid)
尝试
Dim genuineState As SL_True_STATE=SL_True_STATE.SL_GEN_STATE_LAST
Dim ResultInt作为UInteger=SLIsGenuineLocal(WindowsSlided、genuineState、IntPtr.Zero)
如果ResultInt=0,则
_IsGenuineWindows=(genuineState=SL_正版_状态。SL_GEN_状态_为正版)
其他的
Console.WriteLine(“获取信息{0}时出错”,ResultInt.ToString())
如果结束
特例
控制台写入线(例如消息)
结束尝试
返回\u IsGenuineWindows
端函数
副标题()
如果Environment.OSVersion.Version.Major>=6,则
'版本6可以是Windows Vista、Windows Server 2008或Windows 7
如果是GenuineWindows(),则
Console.WriteLine(“原始窗口”)
其他的
Console.WriteLine(“非原始窗口”)
如果结束
其他的
Console.WriteLine(“操作系统不受支持”)
如果结束
Console.ReadLine()
端接头
端模块

这里有一个可以翻译的C#示例,共有5个主题,包括如何在VB.NET上执行此操作。前面已经讨论过一个代码示例。如果没有其他东西,他总是可以参考Windows注册表并从那里读取信息。这似乎是VBScript,但它显示了一个使用WMI的示例,我可以尝试一下,看看是否获得了有希望的结果。不幸的是,您所说的注册表值不在该链接中,但我以前见过它。问题是,该值似乎不准确和/或不稳定,因为我在同一版本的许多不同计算机上看到了不同结果的值。VBScript不是VB.NET;它们就像Java和JavaScript一样相互关联。请参阅@RRUZ的答案,了解与VB.NET相关的内容。不幸的是,这似乎会在由于重新武装而未激活的机器上抛出有效的错误。我没有在没有输入密钥的全新安装上进行测试。我假设它正在按预期工作,只是确切的功能不符合我的要求。我将尝试使用它作为一个示例,并将其处理为另一个类似的函数。谢谢
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