您的位置:首页 > 运维架构 > Shell

.net 使用PowerShell获取电脑中的UUID

2016-06-27 18:32 357 查看

UUID含义是通用唯一识别码(UniversallyUniqueIdentifier),这是一个软件建构的标准,也是被开源软件基金会(OpenSoftwareFoundation,OSF)的组织应用在分布式计算环境(DistributedComputingEnvironment,DCE)领域的一部分。

组成

UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字UUID由以下几部分的组合:(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。(2)时钟序列。(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(GlobalsUniqueIdentifiers)。在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进行转换。

-------以上内容摘自《百度百科》因为软件产品中需要与硬件码进行绑定,就想到了UUID,通过百度,网上搜索了一堆之后,发现大部分的代码都是如下:需要引用:System.Management;
stringprocessor="Win32_Processor";//类名
ManagementClassdriveClass=newManagementClass(processor);
Console.WriteLine(driveClass.GetQualifierValue("UUID"));
然后,让我们部门所有同事在各自的电脑上运行了一次,发现结果如下:

全部运行的结果都是相同的。(这是为什么呢??到现在我也不知道,但不甘心,继续搜Google)----------------------------------------------我是分隔线-----------------------------------------------功夫不负有心人,后来查资料发现,WindowsPowerShell也可以获取UUID,虽然对于PowerShell我也不熟悉,但核心是能不能解决我的问题?
WindowsPowerShell是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用.NETFramework的强大功能。它引入了许多非常有用的新概念,从而进一步扩展了您在Windows命令提示符和WindowsScriptHost环境中获得的知识和创建的脚本。
首先,你必须保证操作系统上有PowerShell安装在您的系统上,另外Vs开发工程中需要引用System.Management.Automation.dll,

这个dll在我电脑以下路径里:“C:\windows\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35\”,

本机操作系统:Win7


核心的代码如下:
privatestaticstringGetUUID()
{try
{
stringuuid=string.Empty;
using(PowerShellPowerShellInstance=PowerShell.Create())
{PowerShellInstance.AddScript("(get-wmiobjectWin32_ComputerSystemProduct).UUID");//OKCollection<PSObject>PSOutput=PowerShellInstance.Invoke();
foreach(PSObjectoutputIteminPSOutput)
{
if(outputItem!=null)
{
uuid+=outputItem.BaseObject.ToString();
}
}
}
returnuuid;
}
catch
{
returnstring.Empty;
}
}

其调用其实就是使用PowerShell的Script进行获取。因为在调用PowerShell时,可能会比较的慢,.net中也提供了异步调用的机制。核心代码如下:
privatestaticstringGetAsyncUUID()
{
try
{
stringuuid=string.Empty;
using(PowerShellPowerShellInstance=PowerShell.Create())
{PowerShellInstance.AddScript("(get-wmiobjectWin32_ComputerSystemProduct).UUID");//OKPSDataCollection<PSObject>outputCollection=newPSDataCollection<PSObject>();
outputCollection.DataAdded+=outputCollection_DataAdded;
PowerShellInstance.Streams.Error.DataAdded+=Error_DataAdded;
IAsyncResultresult=PowerShellInstance.BeginInvoke<PSObject,PSObject>(null,outputCollection);while(result.IsCompleted==false)
{
Console.WriteLine("Waitingforpipelinetofinish...");
Thread.Sleep(1000);//While里面可以写上执行等待中的一些事情
}foreach(PSObjectoutputIteminoutputCollection)
{
if(outputItem!=null)
{
uuid+=outputItem.BaseObject.ToString();
}
}}
returnuuid;
}
catch
{
returnstring.Empty;
}}
staticvoidError_DataAdded(objectsender,DataAddedEventArgse)
{
Console.WriteLine("AnerrorwaswrittentotheErrorstream!");
}staticvoidoutputCollection_DataAdded(objectsender,DataAddedEventArgse)
{
Console.WriteLine("Objectaddedtooutput.");
}

以上代码运行之后,经过测试之后,部门没有重复的。结果如下:





暂时,从以上测试结果分析来看,这个方法是可行的。但目前仍然有比较担心的几个问题:


1、PowerShell在不同的版本里面,调用的方法会不会不一样?因为做为B/s软件需要考虑更多的Windows服务器?

比如:(get-wmiobjectWin32_ComputerSystemProduct).UUID


2、为了安全,PowerShell会不会被服务器给禁用?


3、因为B/s软件是需要IIS来运行的,会不会出现权限不足的情况??


希望有对WindowsPowerShell比较熟悉的朋友能指教一下。


另:本文仅作记录分享,脏水请勿乱吐!===============================补充:==========================================
后期经过大量测试发现:windowsServer2003使用PowerShell获取UUID,可能会报错,所以建议还是使用如下方式:
varc=newManagementClass("Win32_ComputerSystemProduct");
varinstance=c.GetInstances();foreach(variininstance)
Console.WriteLine(i["uuid"]);

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航