【问题标题】:How to get the Computer Description?如何获得计算机描述?
【发布时间】:2017-04-27 11:17:52
【问题描述】:

大家好,

如何以编程方式获取计算机描述? 我正在使用 C# 和 .NET 2.0。

我尝试了Console.WriteLine(Dns.GetHostName());,但它与Full computer name 相呼应。

我也使用了以下代码:

ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem") ;
ManagementObjectCollection queryCollection1 = query1.Get();

foreach( ManagementObject mo in queryCollection1 )
{
    Console.WriteLine(mo["Description"].ToString());
}

但这似乎不起作用,我遇到了这个异常:

Exception System.IO.FileNotFoundException was thrown in debuggee: Could not load file or assembly 'System.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

【问题讨论】:

  • 你安装了powershell吗?
  • 你的第二种方法是正确的,但你得到的例外是奇怪的。您是如何添加对 System.Management 的引用的?
  • @AvnerShahar-Kashtan: 通过导入它using System.Management; 我还在我的项目的参考中添加了它。
  • 导入是一回事,但还需要添加引用:项目根目录右键->添加引用->.NET选项卡->System.Management。

标签: c# .net-2.0


【解决方案1】:

它在注册表值中

HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\srvcomment

最简单的访问方法是:

using Microsoft.Win32;  

string key = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters";
string computerDescription = (string)Registry.GetValue(key, "srvcomment", null);

【讨论】:

  • 请,请,请,不要这样做。此注册表项是technically documented,但这不是支持的查询此信息的方式。使用 NetServerGetInfoSERVER_INFO_101 - 这将通过 C/C++、Pinvoke 或 JNI 提供。特别是,一些 AV 产品锁定了 reg 密钥,但 Net API 继续工作。
  • @NicholasWilson NetServerGetInfo 似乎非常参与查询,包括结构和所有 PInvoke 定义。
  • 结构涉及什么?我承认 PInvoke 会很不方便(也许毕竟有一个托管 API?),但它比在 Windows 9 发布或其他东西时让它不起作用更痛苦。试试这个:删除 lanmanserver regkey 上的所有写权限,然后更新服务器注释,并使用 Net API 查询它。显然,reg 键正在为遗留应用程序模拟,不再是信息的主要位置。
  • @NicholasWilson 回答您的问题:声明它。我不是在争论你的观点,我只是说这与“理想”解决方案之间存在巨大的实用性差距。请随时使用代码示例添加您的替代方案作为答案。
【解决方案2】:

下面的代码将获取计算机描述。我没有在 .NET 2.0 上对此进行测试,但使用的管理类自 v1.1 以来就已经存在,因此它应该可以工作。

        using System.Management;

        string description;

        using (ManagementClass mc = new ManagementClass("Win32_OperatingSystem"))
        using (ManagementObjectCollection moc = mc.GetInstances())
        {
            foreach (ManagementObject mo in moc)
            {
                if (mo.Properties["Description"] != null)
                {
                    description = mo.Properties["Description"].Value.ToString();
                    break;
                }
            }
        }

【讨论】:

  • powershell 无法识别这些。
【解决方案3】:

您需要来自 windows SDK 的 DLL System.Management.Automation.dll https://stackoverflow.com/a/1187978/169714

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2022-12-09
    相关资源
    最近更新 更多