草庐IT

c# - 如何以编程方式从 .NET 的注册表中删除 Windows 产品 key ?

coder 2024-06-11 原文

我如何以编程方式从 .NET(C# 或 VB.NET)的注册表中删除 Windows 产品 key ,以重现与调用 Microsoft 的合法 slmgr.vbs 脚本文件时相同的效果 /cpky argument?...所以请不要在我的问题中将“删除”误解为“卸载”。我只想删除与 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion 中存储和编码的 Windows 产品 key 相对应的字节:DigitalProductId 注册表值, 因此产品 key 仍然安装但第三方应用程序无法访问它,如 ProduKey .

我试图检查 slmgr.vbs 脚本文件(存储在 C:\Windows\System32),它引导我进入这个方法 block :

Private Sub ClearPKeyFromRegistry()
    Dim objService

    On Error Resume Next

    set objService = GetServiceObject("Version")
    QuitIfError()

    objService.ClearProductKeyFromRegistry()
    QuitIfError()

    LineOut GetResource("L_MsgClearedPKey")
End Sub

然而,我有点迷失了试图找到和理解 GetServiceObject("Version") 调用的来源和作用,因为它似乎不是内置的VBS 成员它似乎没有被声明为脚本文件中的任何本地成员,而且我没有在 MSDN 文档/VBS 引用中找到有关“GetServiceObject”的任何信息。

PS:请注意,我不会依赖 slmgr.vbs 文件的存在来解决此问题,只需从 C# 中调用该脚本文件...

更新

我刚刚在 Windows 文件系统的 dll 文件中扫描了字符串“ClearProductKeyFromRegistry”,并在 sppwmi.dll 文件中找到了它,但不幸的是该函数不是导出,然后在谷歌上进行简单的研究,它引导我到 ClearProductKeyFromRegistry method of the SoftwareLicensingService class 在 MSDN 上,但现在我不知道如何使用它。我试图查找有关如何在 .NET 中使用现有 WMI 提供程序的信息,但我在 WWW 上看到的所有信息都是关于如何实现/创建 WMI 提供程序的。

最佳答案

在同一个脚本中,您会找到 GetServiceObject 方法(以及它使用的常量和全局变量)。要找到它们,请在脚本中搜索以下术语:

  • Function GetServiceObject
  • ServiceClass =
  • g_objWMIService =
  • L_MsgClearedPKey =

所以这只是跟踪代码和转换行的问题。下面是我为该方法及其依赖项的完整 VBScript 版本想出的内容:

private const L_MsgClearedPKey = "Product key from registry cleared successfully."
private const ServiceClass = "SoftwareLicensingService"

g_strComputer = "."
Set g_objWMIService = GetObject("winmgmts:\\" & g_strComputer & "\root\cimv2")

Private Sub ClearPKeyFromRegistry()  
    Dim objService

    On Error Resume Next

    set objService = GetServiceObject("Version")
    QuitIfError()

    objService.ClearProductKeyFromRegistry()
    QuitIfError()

    LineOut GetResource("L_MsgClearedPKey")
End Sub

Function GetServiceObject(strQuery)
    Dim objService
    Dim colServices

    On Error Resume Next

    Set colServices = g_objWMIService.ExecQuery("SELECT " & strQuery & 
        " FROM " & ServiceClass)
    QuitIfError()

    For each objService in colServices
        QuitIfError()
        Exit For
    Next

    QuitIfError()

    set GetServiceObject = objService
End Function

下一步是将其简化为一个方法。我继续删除所有 QuitIfError() 调用和 On Error Resume Next,因为我们可以将代码包装在 try/catch 阻止。在替换常量和全局变量并组合这些方法之后,我想出了这个:

Dim objService
Dim colServices
Dim g_objWMIService

Set g_objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colServices = g_objWMIService.ExecQuery("SELECT Version FROM SoftwareLicensingService")

For each objService in colServices
    Exit For
Next

objService.ClearProductKeyFromRegistry()

LineOut "Product key from registry cleared successfully."

现在,因为我们使用的是 WMI,所以我们需要引用 system.management 程序集并添加一个 using:

using System.Management;

然后这只是一个转换问题。其中一些我以前没有做过,但它应该可以解决问题:

private static void ClearProductKeyFromRegistry()
{
    const string query = "SELECT Version FROM SoftwareLicensingService";
    var searcherProd = new ManagementObjectSearcher("\\\\.\\ROOT\\cimv2", query);
    var results = searcherProd.Get();

    foreach (ManagementObject result in results)
    {
        result.InvokeMethod("ClearProductKeyFromRegistry", null);
        break;
    }

    Console.WriteLine("Product key from registry cleared successfully.");
}

关于c# - 如何以编程方式从 .NET 的注册表中删除 Windows 产品 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44296456/

有关c# - 如何以编程方式从 .NET 的注册表中删除 Windows 产品 key ?的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  4. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  5. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  6. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  7. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  8. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  9. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  10. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

随机推荐