寻找唯一的GUID以标识Windows安装


15

我正在寻找Windows注册表中存储的唯一GUID,这将有助于我识别Windows安装或PC。

GUID必须;

  • 永远存在
  • 对于特定的Windows安装是唯一的,即其他任何计算机都不会具有相同的ID
  • 从不改变

非常感谢


为什么在SF和SU上发布?superuser.com/questions/82484/…–
MDMarra,

Answers:


8

您可以从Windows注册表获取GUID,例如:

var regpath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography\\MachineGuid";
var oWSS = new ActiveXObject("WScript.Shell");
clientGUID = oWSS.RegRead(regpath);

您的代码是C#还是其他编程语言?
蒂姆(Tim)

我在Windows 7小工具中使用过的JavaScript。
Friednail

1
C#和Javascript具有非常相似的语法吗?
蒂姆(Tim)

抱歉,不能告诉你,我对C#不熟悉。这些只是简单代码的3行,它们包含变量定义,字符串文字,创建新对象以及使用点表示法访问对象的方法。可能还有大量其他代码结构可用来比较语言。
Friednail

@Tim,我想您有兴趣阅读C#中的注册表项?如果是这样,那么这样的问题可能会对您有所帮助
Friednail

7

如果用于该安装的驱动器移至另一个系统,您希望该数字更改还是保持不变?

如果安装是用ghost或其他方式克隆的,您是否希望更改此数字?您是否可以依靠始终按照Microsoft的建议进行系统准备的克隆系统?如果可以确保从未克隆安装,则SID应该很好。

如果是多重引导系统(即系统装有Windows 7和Windows XP),是否需要将这两个安装标识为唯一,相关或其他?

为什么您需要将它作为Windows安装的一部分,而不是硬件提供的东西,也许是处理器序列号

我假设您正在针对用于清单目的的某种脚本或工具询问此问题?

为什么不在第一次运行该工具时简单地生成自己的编号并将其保存在LOCAL_MACHINE注册表配置单元中?甚至可能使用RFC4122 Type 1编号,该编号应包括网络接口之一的硬件地址。这样,您可以通过将UUID与当前的网络适配器进行比较来检查UUID是否仍属于该系统。


2

您要使用Windows产品ID。这是一个唯一的数字,部分是由安装的产品密钥生成的,一部分是由硬件配置生成的(包括哈希值),包括处理器序列号和第一个NIC的MAC地址。您可以在这篇TechNet文章(有些过时,但仍然有效)上阅读有关它的内容。产品ID可以在“系统信息”屏幕上找到,也可以通过几种方法以编程方式找到。

系统信息


保存用户窗口许可证注册表位于:HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows NT \ CURRENTVERSION,读它不需要特别的技巧
瓦尔特Vehoeven

0

假设它是Windows服务器,则有一篇知识库文章讨论如何将其从Win2k中删除KB224544

我不知道LDP.exe是否仍然可以那样运行,但是可能如此。


该文章仅适用于域控制器。
MDMarra

感谢您提供的信息,我正在寻找所有Windows版本(XP及更高版本)上都将存在的GUID
user28967 2009年


0

如果您要确定Windows安装,则可能不走运。在公司环境中,通常对工作站进行映像而不是对其进行安装。从该映像构建的每台计算机都是相同的。

与您所描述的最接近的是机器的SID,但这不能工作有两个原因:

  1. 镜像的Windows XP计算机具有相同的SID,除非您对它们运行NewSID,但许多人却没有这样做。
  2. 单个域上的所有域控制器共享相同的计算机SID。

您需要该标识符做什么?如果可能的话,最好的选择是自己创建一个。


1
如果计算机在映像后是syspreps,则SID将不同。如果不是(通常不是),则SID将相同。
mrdenny


0

系统卷的DriveId怎么样?Win32_Volume通过使用SystemVolume True查找条目,可以从WMI类获取ID 。

在PowerShell中:

gwmi win32_volume -filter 'SystemVolume=true' | ft -a DriveLetter,SystemVolume,DeviceId

(这当然可以是远程的。)


0

Windows Update使用了一个SID,您也许可以使用它。同样,不能保证它每次都是唯一的,或者不会改变。

我认为最能满足您需求的是MAC地址,但是如果更换了NIC,它可能会改变。

最好的选择是将自己的GUID写入注册表并使用它。


0

若要确认特定计算机上的计算机SID,可以运行SysInternals PSGETSID%COMPUTERNAME%$。(域SID)。

http://blogs.msdn.com/aaron_margosis/archive/2009/11/05/machine-sids-and-domain-sids.aspx

编辑:删除了对注册表中机器SID的引用,这可能不是唯一的(甚至是正确的)。


哦,拜托,如果您要修改某人的身分,请至少发表评论,让他们知道出了什么问题。
马特·西蒙斯


@丹尼斯-对。因此,如果它在域上:psgetsid.exe%computername%$将产生一个唯一的标识符。
Greg Askew,

@Greg:如果您使用映像构建工作站怎么办?如果您没有运行newsid,则它们将共享同一台计算机的SID。
Stephen Jennings

@Stephen-使用域SID将解决该问题。 blogs.msdn.com/aaron_margosis/archive/2009/11/05/...
格雷格歪

-1

为什么不只使用计算机名称?它在您的域中将是唯一的,所有Windows安装都只有一个,并且只有在域管理员更改它后才会更改,除非进行更正,否则永远不需要。


-2

我也需要找到一种方法来全局唯一地标识Windows安装。首先,为了正确分类和识别备份映像并确定哪些映像在哪些计算机上恢复。其次,为了命名用于同步文件的同步对,并根据同步所涉及的机器来确定使用哪个同步对。

在阅读了几篇文章(包括本网站上的文章)之后,我得出结论,没有简单的方法来找到Windows安装的全局唯一标识符。太可惜了 与硬件一样,软件也应具有自己的序列号。那好吧!因此,这是我的解决方法:我没有找到一个全局唯一的标识符,而是创建了一个sylized语句,该语句的灵感来自于Microsoft在Windows上命名网络驱动器的方式以及在Virtual PC中命名共享文件夹的方式:“ [[WINDOWS产品ID(作为变量)]安装在[计算机序列号(作为变量))]。尽管Windows产品标识号仅在相应产品密钥范围内是唯一的,但是在多个安装中,它仍然可能是相同的,特别是在包含工厂安装的Windows的批量生产的计算机上,但是序列号数字是唯一的,并且在一台计算机之间是不同的。上述公式仅是我需要满足的目的;我不需要SID(我假设它表示安全标识符))或其他更复杂的东西,因为这两个变量的组合完全引用了我需要识别的Windows安装,而每个单独的变量对我来说都没有用。首先,特别是,在同一制造商制造的同一产品系列中找到的Windows产品标识是相同的,这对我没有用,因为我拥有几台相同的计算机。其次,序列号不能唯一地标识,因为我在一台计算机上确实安装了多个Windows,而计算机序列号无法解决。因此,我建议使用我的方法。

另外,在询问之前:我选择不以计算机名称为基础。该信息是基于用户的,因此需要进行盘点。但是,Windows产品标识和计算机序列号已经被标识,盘点并始终连接到两个特定产品,从而消除了重新库存它们的需要。我不会选择使用硬盘驱动器的唯一标识符来标识Windows安装,因为我能够并且很容易将它们从一台机器切换到另一台机器,尤其是在驱动器容量处于恒定流量状态时。同样,我将很少使用中央处理单元或母板的识别命名法,正如此前在Shoeless的先前答复中所建议的那样。。最后,我也拒绝识别Windows安装的最明显的选择(尽管我所看到的其他任何人都没有提及它):使用产品密钥。尽管它是唯一的,但它只是安装特定版本Windows的许可证;它实际上并没有连接到特定的Windows安装,并且即使通过购买特定计算机获得了许可,也没有将其区分为安装在特定计算机上。


3
您对这个问题的答案是...?
猎鹿人(Deer Hunter)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.