0

我正在使用 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的答案标记为已接受。

4

1 回答 1

1

http://msdn.microsoft.com/en-us/library/bb671200(v=vs.90).aspx

public void QueryRemoteComputer()
    {
        string queryString = "*[System/Level=2]"; // XPATH Query
        SecureString pw = GetPassword();

        EventLogSession session = new EventLogSession(
            "RemoteComputerName",                               // Remote Computer
            "Domain",                                  // Domain
            "Username",                                // Username
            pw,
            SessionAuthentication.Default);

        pw.Dispose();

        // Query the Application log on the remote computer.
        EventLogQuery query = new EventLogQuery("Application", PathType.LogName, queryString);
        query.Session = session;

        try
        {
            EventLogReader logReader = new EventLogReader(query);

            // Display event info
            DisplayEventAndLogInformation(logReader);
        }
        catch (EventLogException e)
        {
            Console.WriteLine("Could not query the remote computer! " + e.Message);
            return;
        }
    }
于 2013-01-10T05:49:43.750 回答