使用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的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索powershell
.net获取uuid
powershell获取文件名、powershell获取主机名、powershell 获取hash、powershell获取ip、powershell 获取时间,以便于您获取更多的相关知识。

时间: 2024-08-03 11:17:52

使用PowerShell .Net获取电脑中的UUID_实用技巧的相关文章

如何获取电脑中多个硬盘

问题描述 我想获取电脑中多个硬盘插入的U盘,移动硬盘,选择对应的设备后,再读取里面的文件.请问如何实现? 解决方案 解决方案二:API可以试试解决方案三:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;namespa

Mac电脑Safari 8.0 实用技巧汇总

  现在,不少人都在使用Mac电脑,大家都发现了,在 OS X Yosemite 中,Safari 升级到了全新的 8.0 版本.除了全新的界面,更加流畅的性能,这一版本还带来了许多实用的改变,小编就将向你介绍一些你可能还没体验过的新功能和小技巧.一起来看看Mac电脑Safari 8.0 实用技巧汇总吧. 1.全新的标签管理界面 Safari 8 的感觉和 iOS 系统里的移动端越来越接近,最明显的就是全新的标签管理界面.在这里你可以一起查看当前打开的所有标签的缩略图. 打开标签管理界面,你可以

Powershell实现获取电脑序列号功能脚本分享_PowerShell

支持所有版本. 先前的技巧中我们知道如何从戴尔序列号去查询保修信息.其它供应商也有类似服务. 下面一段代码能获取电脑序列号: 复制代码 代码如下: $ComputerName = $env:COMPUTERNAME   $serial = (Get-WmiObject -ComputerName $ComputerName -Class Win32_BIOS).SerialNumber "Your computer serial is $serial"

Silverlight中动态获取Web Service地址_实用技巧

在使用WCF或者WS进行数据库操作的时候都需要有一个明确的服务地址,如果是WCF就是svc文件地址.初学者通常会直接使用VS的Add Service Reference来添加引用.这的确是十分方便的手段,但是这样会带来什么样的麻烦呢? 第一,在开发的阶段一旦改变了WS文件的目录结构就必须改变SL工程中的WS地址,而且这种改变并不是单纯的Update Service Reference这么简单,因为地址已经改变了,你必须删掉旧的Reference来添加新的Reference,这是其一. 第二, 当

ASP.NET中实现获取调用方法名_实用技巧

本文实例讲述了ASP.NET中实现获取调用方法名的技巧.分享给大家供大家参考.具体实现方法如下: 在写记录日志功能时,需要记录日志调用方所在的模块名.命名空间名.类名以及方法名,想到使用的是反射(涉及到反射请注意性能),但具体是哪一块儿还不了解,于是搜索,整理如下:   需要添加相应的命名空间: 复制代码 代码如下: using System; using System.Diagnostics; using System.Reflection; 如果仅是获取当前方法名,可以使用如下代码: 复制代

利用sender的Parent获取GridView中的当前行(获取gridview的值)_实用技巧

获取GridView当行有好几个方法: 1 加RowCommand事件中,判断请求的发出按钮控件名,根据传递的参数来获取当前行中我们需要的参数.2 GridView设置datakeynames方式. 以上方法实现不再累赘. 今天给大家介绍一种最方便,也最满足日常思维的好办法:采用控件事件的sender的Parent来获取cell对象,再取cell的上级对象,也就是row对象了.简单吧! 示例如下:在第三列中放了一个模板列,放入了一个CheckBox,想法是在选中时,设置第四列Lable状态标识为

DataList中TextBox onfocus调用后台void静态方法及获取相应行数_实用技巧

昨天在某一论坛上看到的.Insus.NET尝试做了一下,算是练习了. Insus.NET的测试演示: xxx.aspx:  复制代码 代码如下: <asp:DataList ID="dlItemGeneral" runat="server" CellPadding="0" CellSpacing="0" Width="100%" OnItemDataBound="dlItemGeneral_

Javascript仿PHP $_GET获取URL中的参数_javascript技巧

复制代码 代码如下: /* 像PHP的 $_GET['arg'] 那样获得地址栏GET参数 */function getArgs() {    var args = {};    var query = location.search.substring(1); // Get query string    var pairs = query.split("&");                   // Break at ampersand     for(var i =

ASP.NET连接数据库并获取数据方法总结_实用技巧

本文实例讲述了ASP.NET连接数据库并获取数据方法.分享给大家供大家参考,具体如下: *连接对象的用法SqlConnection,SqlCommand,SqlDataAdapter *数据访问方式的写法 1.获取数据: //引用这两个命名空间 using System.Data.SqlClient; using System.Data; // 初始化连接对象 SqlConnection conn = new SqlConnection(); conn.ConnectionString = "U