UUID含义是通用惟一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。windows
组成
UUID是指在一台机器上生成的数字,它保证对在同一时空中的全部机器都是惟一的。一般平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字 安全
UUID由如下几部分的组合: 服务器
(1)当前日期和时间,UUID的第一个部分与时间有关,若是你在生成一个UUID以后,过几秒又生成一个UUID,则第一个部分不一样,其他相同。 异步
(2)时钟序列。 分布式
(3)全局惟一的IEEE机器识别号,若是有网卡,从网卡MAC地址得到,没有网卡以其余方式得到。 函数
UUID的惟一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最广泛的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中能够用CreateUUID()函数很简单地生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每一个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12),能够从cflib 下载CreateGUID() UDF进行转换。测试
-------以上内容摘自《百度百科》ui
由于软件产品中须要与硬件码进行绑定,就想到了UUID,经过百度,网上搜索了一堆以后,发现大部分的代码都是以下:spa
须要引用:System.Management;操作系统
string processor = "Win32_Processor";//类名 ManagementClass driveClass= new ManagementClass(processor); Console.WriteLine(driveClass.GetQualifierValue("UUID"));
而后,让咱们部门全部同事在各自的电脑上运行了一次,发现结果以下:
所有运行的结果都是相同的。(这是为何呢??到如今我也不知道,但不甘心,继续搜Google)
----------------------------------------------我是分隔线-----------------------------------------------
功夫不负有心人,后来查资料发现,Windows PowerShell也能够获取UUID,虽然对于PowerShell我也不熟悉,但核心是能不能解决个人问题?
Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者能够利用 .NET Framework 的强大功能。
它引入了许多很是有用的新概念,从而进一步扩展了您在 Windows 命令提示符和 Windows Script Host 环境中得到的知识和建立的脚本。
首先,你必须保证操做系统上有PowerShell安装在您的系统上,另外Vs开发工程中须要引用 System.Management.Automation.dll,
这个dll在我电脑如下路径里:“ C:\windows\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35\”,
本机操做系统:Win7
核心的代码以下:
private static string GetUUID() { try { string uuid = string.Empty; using (PowerShell PowerShellInstance = PowerShell.Create()) { PowerShellInstance.AddScript("(get-wmiobject Win32_ComputerSystemProduct).UUID"); //OK Collection<PSObject> PSOutput = PowerShellInstance.Invoke(); foreach (PSObject outputItem in PSOutput) { if (outputItem != null) { uuid += outputItem.BaseObject.ToString(); } } } return uuid; } catch { return string.Empty; } }
其调用其实就是使用PowerShell的Script进行获取。由于在调用PowerShell时,可能会比较的慢,.net中也提供了异步调用的机制。核心代码以下:
private static string GetAsyncUUID() { try { string uuid = string.Empty; using (PowerShell PowerShellInstance = PowerShell.Create()) { PowerShellInstance.AddScript("(get-wmiobject Win32_ComputerSystemProduct).UUID"); //OK PSDataCollection<PSObject> outputCollection = new PSDataCollection<PSObject>(); outputCollection.DataAdded += outputCollection_DataAdded; PowerShellInstance.Streams.Error.DataAdded += Error_DataAdded; IAsyncResult result = PowerShellInstance.BeginInvoke<PSObject, PSObject>(null, outputCollection); while (result.IsCompleted == false) { Console.WriteLine("Waiting for pipeline to finish..."); Thread.Sleep(1000); // While里面能够写上执行等待中的一些事情 } foreach (PSObject outputItem in outputCollection) { if (outputItem != null) { uuid += outputItem.BaseObject.ToString(); } } } return uuid; } catch { return string.Empty; } }
static void Error_DataAdded(object sender, DataAddedEventArgs e) { Console.WriteLine("An error was written to the Error stream!"); } static void outputCollection_DataAdded(object sender, DataAddedEventArgs e) { Console.WriteLine("Object added to output."); }
以上代码运行以后,通过测试以后,部门没有重复的。结果以下:
暂时,从以上测试结果分析来看,这个方法是可行的。但目前仍然有比较担忧的几个问题:
一、PowerShell在不一样的版本里面,调用的方法会不会不同?由于作为B/s软件须要考虑更多的Windows服务器?
好比: (get-wmiobject Win32_ComputerSystemProduct).UUID
二、为了安全,PowerShell会不会被服务器给禁用?
三、由于B/s软件是须要IIS来运行的,会不会出现权限不足的状况??
但愿有对Windows PowerShell比较熟悉的朋友能指教一下。
另:本文仅做记录分享,脏水请勿乱吐!
===============================补充:==========================================
后期通过大量测试发现:windows Server 2003 使用PowerShell 获取UUID,可能会报错,因此建议仍是使用以下方式:
var c = new ManagementClass("Win32_ComputerSystemProduct"); var instance = c.GetInstances(); foreach (var i in instance) Console.WriteLine(i["uuid"]);