リモートコンピューターの管理者ではないユーザーのセキュリティコンテキストで、リモートコンピューターに対して次のWMIクエリを実行しています。
select * from Win32_LogonSession where LogonType = 2
クエリはWin32_LogonSessionのインスタンスを返しません。(管理者と同じクエリを実行すると、現在ログオンしているユーザーが返されることに注意してください。これが私の目標です。)
Technetの指示に従って、このユーザーのリモートWMI / DCOMアクセスを有効にしました(次のクエリを実行して確認しました。これにより、LogonType = 3のWin32_LogonSessionのインスタンスが返されます)。
select * from Win32_LogonSession
これが私が実行しているC#コードの完全なサンプルです:
var scope = new ManagementScope("\\\\SERVER\\root\\cimv2")
{
Options =
{
Impersonation = ImpersonationLevel.Impersonate,
Password = "myPassword",
Username = "DOMAIN\\myUser"
EnablePrivileges = true,
Authentication = AuthenticationLevel.Packet
}
};
scope.Connect();
var query = new ObjectQuery("select * from Win32_LogonSession where LogonType = 2");
using (var searcher = new ManagementObjectSearcher(scope, query))
{
var managementObjects = searcher.Get();
// managementObjects is empty!
}
ユーザーがWMIをリモートで照会するための十分なアクセス権を持っている場合でも、このユーザーがWin32_LogonSessionの特定のインスタンス(LogonType = 3-Network)のみを受け取り、他のインスタンス(LogonType = 2-Interactiveなど)を受け取らないのはなぜですか?
いくつかの追加情報:The Code Projectに関するこの記事によると、LocalSystemアカウントのみが、すべてのログオンセッションを照会するための十分なアクセス権を持っています。
コードプロジェクトでのログオンセッションの列挙
ローカルのAdministratorsグループのメンバーであるだけで十分であると思われるため、これは完全には当てはまらないようです。しかし、これは、完全な管理者権限を付与せずにWMIオブジェクトへのアクセス許可を付与することを妨げる文書化されていない制限があることを意味しているのでしょうか。