【问题标题】:How to get system properties on a webpage?如何在网页上获取系统属性?
【发布时间】:2010-07-14 14:24:27
【问题描述】:

我在asp.net 中的一个网站上工作。我需要网页上的系统属性,如 RAM、处理器、硬盘驱动器等。如何得到它?

【问题讨论】:

  • 您想要哪台计算机的统计信息?
  • @pranay, @SLaks - 是的,适用于客户端计算机。

标签: c# .net asp.net


【解决方案1】:

如果您想获取客户计算机的统计信息,请放弃;不可能。 (除非您编写浏览器插件,否则您真的不应该这样做)

如果您想获取网络服务器的统计信息,这是很有可能的。

这是我对这样一个页面的实现:

<%@ Page Title="Server Stats" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
    CodeFile="Stats.aspx.cs" Inherits="Stats" %>

<%@ Import Namespace="System.Diagnostics" %>
<%@ Import Namespace="Microsoft.VisualBasic.Devices" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
    <style type="text/css">
        body {
            background-color: #9DC0E4;
        }
        table.Details {
            width: 550px;
            margin-left: -275px;
            left: 50%;
            position: absolute;
        }
        table.Details tbody.Group {
            border-bottom: solid black 2px;
            margin-bottom: 15px;
        }
        table.Details th.Group {
            font-size: x-large;
            border-bottom: dashed 1px navy;
        }
        table.Details th.Name {
            text-align: left;
        }
        table.Details td.Value {
            text-align: right;
        }
    </style>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
    <%
        var computer = new ComputerInfo();
        using (var iis = Process.GetCurrentProcess())
        using (var cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total"))
        using (var uptime = new PerformanceCounter("System", "System Up Time")) {
            cpu.NextValue();
            uptime.NextValue();
    %>
    <table class="Details">
        <tbody class="Group">
            <tr>
                <th class="Group" colspan="2">Environment</th>
            </tr>
            <tr>
                <th class="Name">Local server time</th>
                <td class="Value">
                    <%= DateTime.Now.ToString("F")%></td>
            </tr>
            <tr>
                <th class="Name">OS</th>
                <td class="Value">
                    <%= computer.OSFullName%><br />
                    <%= Environment.OSVersion.ToString()%></td>
            </tr>
            <tr>
                <th class="Name">Machine name</th>
                <td class="Value">
                    <%= Environment.MachineName%></td>
            </tr>
            <tr>
                <th class="Name">User name</th>
                <td class="Value">
                    <%= Environment.UserName%></td>
            </tr>
            <tr>
                <th class="Name">Windows domain</th>
                <td class="Value">
                    <%= Environment.UserDomainName%></td>
            </tr>
        </tbody>
        <tbody class="Group">
            <tr>
                <th class="Group" colspan="2">IIS</th>
            </tr>
            <tr>
                <th class="Name">IIS Uptime</th>
                <td class="Value">
                    <%= (DateTime.Now- iis.StartTime).ToApproximateString()%></td>
            </tr>
            <tr>
                <th class="Name">Priority</th>
                <td class="Value">
                    <%= iis.PriorityClass%></td>
            </tr>
            <tr>
                <th class="Name">Physical Memory Used</th>
                <td class="Value">
                    <%= ToSizeString(iis.WorkingSet64)%></td>
            </tr>
            <tr>
                <th class="Name">Virtual Memory Used</th>
                <td class="Value">
                    <%= ToSizeString(iis.VirtualMemorySize64)%></td>
            </tr>
        </tbody>
        <tbody class="Group">
            <tr>
                <th class="Group" colspan="2">Hardware</th>
            </tr>
            <tr>
                <th class="Name">Processors</th>
                <td class="Value">
                    <%= Environment.ProcessorCount.ToString()%></td>
            </tr>
            <tr>
                <th class="Name">Physical memory</th>
                <td class="Value">
                    <%= ToSizeString(computer.TotalPhysicalMemory)%></td>
            </tr>
            <tr>
                <th class="Name">Virtual memory</th>
                <td class="Value">
                    <%= ToSizeString(computer.TotalVirtualMemory)%></td>
            </tr>
        </tbody>
        <tbody class="Group">
            <tr>
                <th class="Group" colspan="2">Performance</th>
            </tr>
            <tr>
                <th class="Name">Uptime</th>
                <td class="Value">
                    <%= TimeSpan.FromSeconds(uptime.NextValue()).ToApproximateString()%>
                </td>
            </tr>
            <tr>
                <th class="Name">CPU Usage</th>
                <td class="Value">
                    <%= (cpu.NextValue()/100).ToString("p")%>
                </td>
            </tr>
            <tr>
                <th class="Name">Physical memory free</th>
                <td class="Value">
                    <%= ToSizeString(computer.AvailablePhysicalMemory)%></td>
            </tr>
            <tr>
                <th class="Name">Virtual memory free</th>
                <td class="Value">
                    <%= ToSizeString(computer.AvailableVirtualMemory)%></td>
            </tr>
        </tbody>
    </table>
    <%} %>
</asp:Content>

ToSizeString.cs 文件中定义:

protected static string ToSizeString(double bytes) {
    var culture = CultureInfo.CurrentUICulture;
    const string format = "#,0.0";

    if (bytes < 1024)
        return bytes.ToString("#,0", culture);
    bytes /= 1024;
    if (bytes < 1024)
        return bytes.ToString(format, culture) + " KB";
    bytes /= 1024;
    if (bytes < 1024)
        return bytes.ToString(format, culture) + " MB";
    bytes /= 1024;
    if (bytes < 1024)
        return bytes.ToString(format, culture) + " GB";
    bytes /= 1024;
    return bytes.ToString(format, culture) + " TB";
}

ToApproximateString 是在别处定义的扩展方法:

public static string ToApproximateString(this TimeSpan time) {
    if (time.TotalDays > 14)
        return ((int)(time.TotalDays / 7)).ToString("#,0.0") + " weeks";
    if (14 - time.TotalDays < .75)
        return "two weeks";
    if (time.TotalDays > 1)
        return time.TotalDays.ToString("#,0.0") + " days";
    else if (time.TotalHours > 1)
        return time.TotalHours.ToString("#,0.0") + " hours";
    else if (time.TotalMinutes > 1)
        return time.TotalMinutes.ToString("#,0.0") + " minutes";
    else
        return time.TotalSeconds.ToString("#,0.0") + " seconds";
}

【讨论】:

    【解决方案2】:

    此信息可在后面的代码中访问,因此您可以尝试将其与页面加载结合使用来收集用于 aspx 页面的数据。 System.Environment 中有更多可访问的信息,所以去看看吧!

    public override void PageLoad() {
    
             string[] logicalDrives  = System.Environment.GetLogicalDrives();
             //do stuff to put it in the view.
    }
    

    【讨论】:

      【解决方案3】:

      要获取客户端机器的信息..您不能在 Web 应用程序中执行此操作...除非您编写在他们的机器上运行的 ActiveX 控件或 Java 插件。

      但不建议您这样做...防病毒和恶意软件程序可能会认为您没有做好事。

      【讨论】:

        【解决方案4】:

        您不能在 ASP.NET 页面中。

        但是,您可以创建一个 Windows 窗体并使用 ClickOnce 发布它

        当用户点击您页面上的链接时,您可以弹出一个窗口表单。要显示或保存数据,请使用 Web 服务。用户会觉得他没有离开您的网站。

        您可以在 C# 中使用 ManagementSearcherObject 来获取系统信息,例如RAM 在 VB.NET 中你可以只使用 My.Computer。

        我没有使用过 WPF 浏览器应用程序,但你应该可以在那里做同样的事情。

        【讨论】:

          猜你喜欢
          • 2013-12-22
          • 1970-01-01
          • 2012-11-25
          • 2019-05-21
          • 2011-06-27
          • 2015-10-13
          • 1970-01-01
          • 1970-01-01
          • 2010-11-18
          相关资源
          最近更新 更多