我正在使用 EventLogSession、EventLogQuery 和 EventLogReader 类来查询远程计算机,当我使用下面的代码时,它工作正常:
var session = new EventLogSession(machineName,
null, null, null,
SessionAuthentication.Default);
但是在我完全按照我的本地机器指定域、用户名、密码之后,它就不起作用了,抛出
“试图执行未经授权的操作”(UnauthorizedAccessException)异常。
我正在使用的代码是这样的:
var password = new SecureString();
passwordString.ToCharArray().ForEach(ch => password.AppendChar(ch));
var session = new EventLogSession(machineName,
"domain", "username", password,
SessionAuthentication.Default);
MSDN 说,当域、用户名、密码都为空时,EventLogSession 将使用本地计算机的凭据。但是当我在代码中指定它们时,它不起作用,怎么回事?
顺便说一句,我正在使用 Windows Server 2008 R2 来测试代码。但我怀疑这是依赖于操作系统的事情。
更新:原来这是由于我的愚蠢造成的,因为我忘记了 LINQ 的懒惰,或者更确切地说是 C# 的 yield return。为方便起见,我将 ForEach 实现为以下扩展方法
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> sequence, Action<T> action)
{
foreach (var item in sequence)
{
action(item);
yield return item;
}
}
这样,ForEach 将不会实际执行操作委托,直到它被 foreached。因此我永远不会在 char 序列上调用 foreach,它永远不会执行,因此根本没有初始化密码。
抱歉打扰你们,我将tammy的答案标记为已接受。