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 によると、ドメイン、ユーザー名、パスワードがすべて null の場合、EventLogSession はローカル マシンの資格情報を使用します。しかし、コードでそれらを指定すると、機能しません。

ところで、私は Windows Server 2008 R2 を使用してコードをテストしています。しかし、これがOSに依存するものであるとは思えません。

更新:これは私の愚かさが原因であることが判明しました。これは、LINQ の怠惰を忘れたり、C# の戻り値を生成したりするためです。便宜上、次の拡張メソッドとして 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 は foreach されるまでアクション デリゲートを実際に実行しません。したがって、char シーケンスで foreach を呼び出すことはありません。実行されることはないため、パスワードはまったく初期化されません。

ご迷惑をおかけして申し訳ありません。タミーの回答を承認済みとしてマークしました。

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 に答える