我之前在堆栈溢出,但不幸的是我还没有得到任何答复。其实这并不是很紧急,因为这个问题似乎只存在于我的机器上——目前是这样。但我听说,在使用 WMI 时,我们网络内的其他机器也出现了类似的问题。
原始问题:
所以我有这个方法,可以读取用户的配额:
public ulong GetQuotaLimit(string username, string domain, char volume)
{
var scope = GetManagementScope(this, @"root\cimv2");
var path = new ManagementPath(
string.Format(
"Win32_DiskQuota.QuotaVolume='Win32_LogicalDisk.DeviceID=\"{0}:\"',User='Win32_Account.Domain=\"{1}\",Name=\"{2}\"'",
volume, domain, username));
var diskQuotaObj = new ManagementObject(scope, path, null);
var result = Convert.ToUInt64(diskQuotaObj.Properties["Limit"].Value);
return result;
}
它在我同事的机器上运行良好(~200ms),但出于某种原因,在我自己的机器上运行不正常 - 从机器获得响应需要更长的时间,这维持了用户的配额(~2000ms)。两台机器的规格几乎相同(相同的操作系统,相同的硬件),并且它们位于同一个网络和同一个域内。
因此,我检查了两台机器上此请求的网络流量,发现了一件奇怪的事情:建立连接并进行身份验证后,我同事的机器立即继续执行实际请求(从第 491 帧开始)。
192.168.131.95 是维持配额的机器
192.168.131.175是我同事的机器
192.168.144.11 我的机器
这些记录由这些 IP 过滤
但是我的机器继续进行 TCP 三次握手(帧 90-92),然后等待一段时间(这会导致延迟)并继续进行第二次身份验证(从帧 126 开始),然后才最终完成它应该做的事情 - 发送实际请求。
似乎客户端(我的机器)不知为何丢失了连接,但我没有看到任何帧,这实际上表明了这一点。我还听说,WMI 在碎片方面存在一些问题,但段/数据报实际上小于通常的碎片阈值(1500 字节?),并且 wireshark 没有指示帧已重组,因此这不应该是原因。
有人知道为什么会发生这种行为吗?