我如何以编程方式从 .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/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我试图获取一个长度在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
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看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
是的,我知道最好使用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
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha