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 を呼び出すことはありません。実行されることはないため、パスワードはまったく初期化されません。
ご迷惑をおかけして申し訳ありません。タミーの回答を承認済みとしてマークしました。