我需要编写一个函数来生成一个id,该id对于运行Windows操作系统的给定机器是唯一的.
目前,我正在使用WMI查询各种硬件参数并将它们连接在一起并散列它们以获得唯一的id.我的问题是,我应该使用的建议参数是什么?目前,我正在使用bios\cpu\disk数据的组合来生成唯一ID.如果每个指标有多个结果,我会使用第一个结果.
但是,我遇到了一个问题,即双引导到两个不同的Windows操作系统的机器在每个操作系统上生成不同的站点代码,理想情况下不会发生这种情况.
作为参考,这些是我目前使用的指标:
Win32_Processor:UniqueID,ProcessorID,Name,Manufacturer,MaxClockSpeed
Win32_BIOS:Manufacturer
Win32_BIOS:SMBIOSBIOSVersion,IdentificationCode,SerialNumber,ReleaseDate,Version
Win32_DiskDrive:Model, Manufacturer, Signature, TotalHeads
Win32_BaseBoard:Model, Manufacturer, Name, SerialNumber
Win32_VideoController:DriverVersion, Name
Run Code Online (Sandbox Code Playgroud) 我有为AnyCPU编译的ac#单元测试项目.我们的构建服务器是64位机器,并安装了64位SQL Express实例.
测试项目使用类似于以下内容的代码来标识.MDF文件的路径:
private string GetExpressPath()
{
RegistryKey sqlServerKey = Registry.LocalMachine.OpenSubKey( @"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL" );
string sqlExpressKeyName = (string) sqlServerKey.GetValue( "SQLEXPRESS" );
RegistryKey sqlInstanceSetupKey = sqlServerKey.OpenSubKey( sqlExpressKeyName + @"\Setup" );
return sqlInstanceSetupKey.GetValue( "SQLDataRoot" ).ToString();
}
Run Code Online (Sandbox Code Playgroud)
这段代码在我们的32位工作站上工作正常,并且在我最近使用NCover启用代码覆盖率分析之前,在构建服务器上工作正常.因为NCover使用32位COM组件,所以测试运行器(Gallio)作为32位进程运行.
检查注册表,下面没有"实例名称"键
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server
在32位模式下运行的应用程序是否有办法访问Wow6432Node外部的注册表?
我一直在使用安装程序包并使用RegistryKey.OpenBaseKey来处理自定义操作,这些操作可以打开和从64位注册表添加/删除密钥或从MSI包中删除32位注册表,但这需要我在运行我的安装程序之前,使用引导程序或其他东西在目标计算机上安装.NET Framework 4,因为OpenBaseKey仅在.NET Framework 4中引入.理想情况下,我想仅针对.NET Framework 3.5并仍然能够修改OpenBaseKey中的64位或32位注册表配置单元; 那么我不需要.NET 4和安装它的开销.
对于那些不想将.NET 4作为先决条件的人来说,OpenBaseKey还有其他选择吗?可能是像P /调用某种WinAPI方法这样的东西吗?我不确定它会采取什么措施.