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

 更新时间:2016年06月28日 10:19:58   作者:一碗豆芽汤(VMan)  
这篇文章主要介绍了使用PowerShell .Net获取电脑中的UUID 的相关资料,需要的朋友可以参考下

UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。

组成

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进行转换。

-------以上内容摘自《百度百科》

因为软件产品中需要与硬件码进行绑定,就想到了UUID,通过百度,网上搜索了一堆之后,发现大部分的代码都是如下:

需要引用: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.");
}

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

结果如下:

 

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

1、PowerShell在不同的版本里面,调用的方法会不会不一样?因为做为B/s软件需要考虑更多的Windows服务器? 比如: (get-wmiobject Win32_ComputerSystemProduct).UUID

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

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

以上所述是小编给大家介绍的使用PowerShell .Net获取电脑中的UUID的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 为HttpClient添加默认请求报头的四种解决方案

    为HttpClient添加默认请求报头的四种解决方案

    这篇文章主要给大家介绍了关于为HttpClient添加默认请求报头的四种解决方案,文中通过示例代码介绍的非常详细,对大家学习或者使用HttpClient具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • NetCore 配置Swagger的详细代码

    NetCore 配置Swagger的详细代码

    这篇文章主要介绍了NetCore 配置Swagger的方法,通过添加Nuget和添加静态类扩展方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • ASP.NET页面某些选项进行提示判断具体实现

    ASP.NET页面某些选项进行提示判断具体实现

    针对asp.net页面某些选项进行提示判断,比如当保存一个信息时候,需要对当前信息是否为空进行判断
    2013-06-06
  • ASP.NET设置404页面返回302HTTP状态码的解决方法

    ASP.NET设置404页面返回302HTTP状态码的解决方法

    访问网站时错误页面可正常显示,但HTTP状态码却是302,对SEO很不友好,按下列步骤修改使错误页面返回正确的利于SEO的404状态码,感兴趣的朋友可以了解下
    2013-09-09
  • asp.net MaxLengthValidator 最大长度验证控件代码

    asp.net MaxLengthValidator 最大长度验证控件代码

    如果数据库字段为varchar或char类型,ASP.NET控件在可输入汉字的情况下,MaxLength属性不能保证在保存到数据库时不发生截断错误,因此写了一个最大长度验证控件,还可用于多行文本框。
    2009-12-12
  • asp.net实现从Txt文件读取数据到数据视图的方法

    asp.net实现从Txt文件读取数据到数据视图的方法

    这篇文章主要介绍了asp.net实现从Txt文件读取数据到数据视图的方法,涉及asp.net针对文本文件的遍历操作与DataView的写入操作相关技巧,需要的朋友可以参考下
    2015-12-12
  • 用vs调试sql存储过程图文介绍

    用vs调试sql存储过程图文介绍

    想必大家应该有给存储过程找错误的经历吧,一遍遍的去读sql代码,一句一句的测试,发现一个小错误可能都要用很长的时间,接下来将介绍使用vs2010调试存储过程,感兴趣的朋友可以不要错过了啊
    2013-02-02
  • 如何在Asp.Net Core MVC中处理null值的实现

    如何在Asp.Net Core MVC中处理null值的实现

    这篇文章主要介绍了如何在Asp.Net Core MVC中处理null值的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 关于.NET6 Minimal API的使用方式详解

    关于.NET6 Minimal API的使用方式详解

    本文我们主要是介绍了ASP.NET Core 6 Minimal API的常用的使用方式,在.NET6中也是默认的项目方式,整体来说却是非常的简单、简洁、强大、灵活,不得不说Minimal API却是在很多场景都非常适用的
    2021-12-12
  • Asp.net后台把脚本样式输出到head标签中节省代码冗余

    Asp.net后台把脚本样式输出到head标签中节省代码冗余

    最近在学习开发服务器控件,其它就少不了为控件注册js和css之类的资源文件,或者直接注册纯脚本样式。其中就遇到如下问题     1、 注册的资源文件或纯脚本样式在生成的页面中都不在head标签中(当然这个不影响页面功能)     2、 一个页面使用多个一样的控件时,会出现重复输入(出现多余代码)
    2013-02-02

最新评论