C#获取windows下用于标志当前电脑的唯一性编号

最近做的项目,有个需求需要软件注册激活后才能使用,激活这种事情么,从来没做过,网上找找大多数说法都是绑定PC机器的物理硬件,推荐用SmBIOSUUID,获取不到的情况下再用其它硬件序列号组合,但找了一圈没找到现成的C#代码获取相关ID的文章,后来想了下,既然都是cmd指令,那我C#里面直接调用cmd执行指令不就行了,于是就有了下面的代码

    public class ComputerUniqueHelper
    {
        public static string GetComputerUUID()
        {
            var uuid = GetSmBIOSUUID();
            if (string.IsNullOrWhiteSpace(uuid))
            {
                var cpuID = GetCPUID();
                var biosSerialNumber = GetBIOSSerialNumber();
                var diskSerialNumber = GetDiskDriveSerialNumber();
                uuid = $"{cpuID}__{biosSerialNumber}__{diskSerialNumber}";
            }
            return uuid;
        }

        public static string? GetSmBIOSUUID()
        {
            var cmd = "wmic csproduct get UUID";
            return ExecuteCMD(cmd, output =>
            {
                string? uuid = GetTextAfterSpecialText(output, "UUID");
                if (uuid == "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF")
                {
                    uuid = null;
                }
                return uuid;
            });
        }
        public static string? GetCPUID()
        {
            var cmd = "wmic cpu get processorid";
            return ExecuteCMD(cmd, output =>
            {
                var cpuid = GetTextAfterSpecialText(output, "ProcessorId");
                return cpuid;
            });
        }
        public static string? GetBIOSSerialNumber()
        {
            var cmd = "wmic bios get serialnumber";
            return ExecuteCMD(cmd, output =>
            {
                var serialNumber = GetTextAfterSpecialText(output, "SerialNumber");
                return serialNumber;
            });
        }
        public static string? GetDiskDriveSerialNumber()
        {
            var cmd = "wmic diskdrive get serialnumber";
            return ExecuteCMD(cmd, output =>
            {
                var serialNumber = GetTextAfterSpecialText(output, "SerialNumber");
                return serialNumber;
            });
        }
        private static string? GetTextAfterSpecialText(string fullText, string specialText)
        {
            if (string.IsNullOrWhiteSpace(fullText) || string.IsNullOrWhiteSpace(specialText))
            {
                return null;
            }
            string? lastText = null;
            var idx = fullText.LastIndexOf(specialText);
            if (idx > 0)
            {
                lastText = fullText.Substring(idx + specialText.Length).Trim();
            }
            return lastText;
        }
        private static string? ExecuteCMD(string cmd, Func<string, string?> filterFunc)
        {
            using var process = new Process();
            process.StartInfo.FileName = "cmd.exe";
            process.StartInfo.UseShellExecute = false;//是否使用操作系统shell启动
            process.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
            process.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
            process.StartInfo.RedirectStandardError = true;//重定向标准错误输出
            process.StartInfo.CreateNoWindow = true;//不显示程序窗口
            process.Start();//启动程序
            process.StandardInput.WriteLine(cmd + " &exit");
            process.StandardInput.AutoFlush = true;
            //获取cmd窗口的输出信息
            var output = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            process.Close();
            return filterFunc(output);
        }
    }

相关资料
[Windows] 获取设备唯一标识
获取机器序列号的方法
C#程序调用cmd.exe执行命令

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值