从C#(.NET 4.0)开始,我们正在进行这样的WMI调用:
var connectOptions = new ConnectionOptions
{
Authority = "ntlmdomain:" + paramValues.Domain,
Username = paramValues.UserName,
Password = paramValues.Password
};
var scopeString = @"\\" + paramValues.Server + @"\root\cimv2";
var scope = new ManagementScope(scopeString, connectOptions);
scope.Connect();
var queryString = String.Format("SELECT * FROM Win32_NTLogEvent WHERE LogFile = 'Security' AND TimeGenerated > '{0:yyyyMMddHHmm00.000000+0000}'";,
paramValues.StartTime);
var query = new ObjectQuery(queryString);
var searcher = new ManagementObjectSearcher(scope, query);
var queryCollection = searcher.Get();
这样可以正常工作,但只有一个服务器出现故障。在这种情况下,searcher.Get()
调用会挂起。通过Wireshark查看网络流量显示正确返回了事件日志条目,但在某些时候远程服务器只是终止TCP连接。
我发现Wile Tester实用程序在线(http://www.paessler.com/tools/wmitester)似乎不是针对.NET框架编写的(使用DCOM)。我可以使用该工具提供相同的凭据和相同的WMI查询,并获得预期的结果。
我怀疑.NET代码和DCOM调用之间有什么不同,或者我在追逐错误的东西?到目前为止,这是我能找到的工作代码和非工作代码之间的唯一区别。