C# 获取网络计算机系统.Environment.TickCount

C# 获取网络计算机系统.Environment.TickCount,c#,networking,remote-access,gettickcount,C#,Networking,Remote Access,Gettickcount,我一直在搜索如何获取远程PC的System.Environment.TickCount。 使用这个简单的代码可以从我的本地PC获取我想要的信息,但我无法计算如何在我们的域网络中为每台PC获取相同的信息。我想从我们的服务器上运行这个 TimeSpan t = TimeSpan.FromMilliseconds(System.Environment.TickCount); MessageBox.Show(t.Days.ToString() + "days, " + t.Hours.ToString(

我一直在搜索如何获取远程PC的System.Environment.TickCount。 使用这个简单的代码可以从我的本地PC获取我想要的信息,但我无法计算如何在我们的域网络中为每台PC获取相同的信息。我想从我们的服务器上运行这个

TimeSpan t = TimeSpan.FromMilliseconds(System.Environment.TickCount);
MessageBox.Show(t.Days.ToString() + "days, " + t.Hours.ToString() + "hrs & " + t.Minutes.ToString() + "mins.");
我有以下代码来获取网络中的所有计算机名:

public List<String> ListNetworkComputers()
{
    List<String> _ComputerNames = new List<String>();
    String _ComputerSchema = "Computer";
    System.DirectoryServices.DirectoryEntry _WinNTDirectoryEntries = new System.DirectoryServices.DirectoryEntry("WinNT:");
    foreach (System.DirectoryServices.DirectoryEntry _AvailDomains in _WinNTDirectoryEntries.Children)
    {
        foreach (System.DirectoryServices.DirectoryEntry _PCNameEntry in _AvailDomains.Children)
        {
            if (_PCNameEntry.SchemaClassName.ToLower().Contains(_ComputerSchema.ToLower()))
            {
                _ComputerNames.Add(_PCNameEntry.Name);
            }
        }
    }
    return _ComputerNames;
}

不使用“cmd.exe”,也许您可以使用PowerShell?如果是这样,只需一个简单的命令即可打印该属性:
[System.Environment]::TickCount
我需要做同样的事情:获取远程PC的System.Environment.TickCount

我提出了这个解决方案(使用或WMI
LocalDateTime-LastBootUpTime
),但与
Environment.TickCount
(参见下面的代码注释)相比,它并不是100%准确

所以我在网上查了其他的解决方案。原来@HansPassant也提出了同样的建议。对于我的用例来说,+/-100个刻度的差异应该无关紧要

using Microsoft.Management.Infrastructure;
using Microsoft.Management.Infrastructure.Options;
using System;
using System.Linq;
using System.Security;

namespace TickCountTest
{
    class Program
    {
        /// <summary>
        /// Print the system TickCount (converted from Win32_OperatingSystem LocalDateTime - LastBootUpTime properties).
        /// Why? Because this technique can be used to get TickCount from a Remote machine.
        /// </summary>
        public static void Main(string[] args)
        {
            var tickCount = GetRemoteMachineTickCount("REMOTEMACHINENAME");

            if (!tickCount.HasValue)
            {
                throw new NullReferenceException("GetRemoteMachineTickCount() response was null.");
            }

            Console.WriteLine($"TickCount: {tickCount}");
            Console.ReadKey();
        }

        /// <summary>
        /// Retrieves the duration (TickCount) since the system was last started from a remote machine.
        /// </summary>
        /// <param name="computerName">Name of computer on network to retrieve tickcount for</param>
        /// <returns>WMI Win32_OperatingSystem LocalDateTime - LastBootUpTime (ticks)</returns>
        private static int? GetRemoteMachineTickCount(string computerName)
        {
            string namespaceName = @"root\cimv2";
            string queryDialect = "WQL";

            DComSessionOptions SessionOptions = new DComSessionOptions();
            SessionOptions.Impersonation = ImpersonationType.Impersonate;

            var baseLineTickCount = Environment.TickCount; // Note: to determine discrepancy
            CimSession session = CimSession.Create(computerName, SessionOptions);

            string query = "SELECT * FROM Win32_OperatingSystem";
            var cimInstances = session.QueryInstances(namespaceName, queryDialect, query);

            if (cimInstances.Any())
            {
                var cimInstance = cimInstances.First();
                var lastBootUpTime = Convert.ToDateTime(cimInstance.CimInstanceProperties["LastBootUpTime"].Value);
                var localDateTime = Convert.ToDateTime(cimInstance.CimInstanceProperties["LocalDateTime"].Value);

                var timeSpan = localDateTime - lastBootUpTime;
                var tickCount = Convert.ToInt32(timeSpan.TotalMilliseconds);

                var discrepancy = tickCount - baseLineTickCount; // Note: discrepancy about +/- 100 ticks

                return tickCount;
            }

            return null;
        }
    }
}
使用Microsoft.Management.Infrastructure;
使用Microsoft.Management.Infrastructure.Options;
使用制度;
使用System.Linq;
使用系统安全;
名称空间计数测试
{
班级计划
{
/// 
///打印系统计时计数(从Win32_OperatingSystem LocalDateTime-LastBootUpTime属性转换而来)。
///为什么?因为这项技术可以用来从远程机器获取滴答数。
/// 
公共静态void Main(字符串[]args)
{
var tickCount=getRemoteMachineticCount(“REMOTEMACHINENAME”);
如果(!tickCount.HasValue)
{
抛出新的NullReferenceException(“GetRemoteMachineticCount()响应为null”);
}
WriteLine($“TickCount:{TickCount}”);
Console.ReadKey();
}
/// 
///检索自上次从远程计算机启动系统以来的持续时间(滴答数)。
/// 
///网络上要为其检索tickcount的计算机的名称
///WMI Win32_OperatingSystem LocalDateTime-LastBootUpTime(滴答声)
私有静态int?GetRemoteMachineticCount(字符串computerName)
{
字符串namespaceName=@“root\cimv2”;
字符串queryDialect=“WQL”;
DComSessionOptions SessionOptions=新的DComSessionOptions();
SessionOptions.Impersonation=ImpersonationType.Impersonate;
var baseLineTickCount=Environment.TickCount;//注意:用于确定差异
CimSession session=CimSession.Create(computerName,SessionOptions);
string query=“从Win32\U操作系统中选择*”;
var cimcinstances=session.QueryInstances(名称空间名、queryDialect、query);
if(cimcinstances.Any())
{
var cimInstance=cimInstances.First();
var lastBootUpTime=Convert.ToDateTime(cimInstance.CimInstanceProperties[“lastBootUpTime”].Value);
var localDateTime=Convert.ToDateTime(cimInstance.CimInstanceProperties[“localDateTime”].Value);
var timeSpan=localDateTime-lastBootUpTime;
var tickCount=Convert.ToInt32(timeSpan.total毫秒);
var discience=tickCount-baseLineTickCount;//注意:大约+/-100个刻度的差异
返回计数;
}
返回null;
}
}
}

如果您试图同步时钟,可以查看运行本地NTP服务器。我只是想知道每台电脑已运行了多长时间。只需使用System.Management命名空间运行WMI查询即可。您需要Win32_OperatingSystem.LastBootUpTime属性。谢谢,我必须检查一下。至于你的第一条评论,我只是笑了…我真的以为我写了我想做的…我如何在我的应用程序中使用PowerShell?我没有这方面的经验。
using Microsoft.Management.Infrastructure;
using Microsoft.Management.Infrastructure.Options;
using System;
using System.Linq;
using System.Security;

namespace TickCountTest
{
    class Program
    {
        /// <summary>
        /// Print the system TickCount (converted from Win32_OperatingSystem LocalDateTime - LastBootUpTime properties).
        /// Why? Because this technique can be used to get TickCount from a Remote machine.
        /// </summary>
        public static void Main(string[] args)
        {
            var tickCount = GetRemoteMachineTickCount("REMOTEMACHINENAME");

            if (!tickCount.HasValue)
            {
                throw new NullReferenceException("GetRemoteMachineTickCount() response was null.");
            }

            Console.WriteLine($"TickCount: {tickCount}");
            Console.ReadKey();
        }

        /// <summary>
        /// Retrieves the duration (TickCount) since the system was last started from a remote machine.
        /// </summary>
        /// <param name="computerName">Name of computer on network to retrieve tickcount for</param>
        /// <returns>WMI Win32_OperatingSystem LocalDateTime - LastBootUpTime (ticks)</returns>
        private static int? GetRemoteMachineTickCount(string computerName)
        {
            string namespaceName = @"root\cimv2";
            string queryDialect = "WQL";

            DComSessionOptions SessionOptions = new DComSessionOptions();
            SessionOptions.Impersonation = ImpersonationType.Impersonate;

            var baseLineTickCount = Environment.TickCount; // Note: to determine discrepancy
            CimSession session = CimSession.Create(computerName, SessionOptions);

            string query = "SELECT * FROM Win32_OperatingSystem";
            var cimInstances = session.QueryInstances(namespaceName, queryDialect, query);

            if (cimInstances.Any())
            {
                var cimInstance = cimInstances.First();
                var lastBootUpTime = Convert.ToDateTime(cimInstance.CimInstanceProperties["LastBootUpTime"].Value);
                var localDateTime = Convert.ToDateTime(cimInstance.CimInstanceProperties["LocalDateTime"].Value);

                var timeSpan = localDateTime - lastBootUpTime;
                var tickCount = Convert.ToInt32(timeSpan.TotalMilliseconds);

                var discrepancy = tickCount - baseLineTickCount; // Note: discrepancy about +/- 100 ticks

                return tickCount;
            }

            return null;
        }
    }
}