WMI を使用して実行し、ネットワーク共有にアクセスする必要がある C# exe があります。ただし、共有にアクセスすると、UnauthorizedAccessException が発生します。exeを直接実行すると、共有にアクセスできます。どちらの場合も同じユーザー アカウントを使用しています。
私のアプリケーションには、ローカル PC で実行される GUI クライアントと、リモート PC で実行されるバックエンド プロセスの 2 つの部分があります。クライアントがバックエンドに接続する必要がある場合、最初に WMI を使用してリモート プロセスを起動します (以下にコードを再現)。リモート プロセスは、Directory.GetDirectories() を使用してネットワーク共有にアクセスし、クライアントに報告するなど、多くのことを行います。
クライアントが WMI を使用してリモート プロセスを自動的に起動すると、ネットワーク共有にアクセスできなくなります。ただし、リモート デスクトップを使用してリモート マシンに接続し、バックエンド プロセスを手動で起動すると、ネットワーク共有へのアクセスは成功します。
WMI 呼び出しで指定されたユーザーと、リモート デスクトップ セッションにログインしているユーザーは同じなので、権限は同じである必要がありますね。
Directory.Exists()の MSDN エントリには、「Exists メソッドはネットワーク認証を実行しません。事前認証なしで既存のネットワーク共有を照会すると、Exists メソッドは false を返します。」と記載されています。これが関係していると思いますか?ユーザーが WMI セッションで正しく認証されるようにするにはどうすればよいですか?
ConnectionOptions opts = new ConnectionOptions();
opts.Username = username;
opts.Password = password;
ManagementPath path = new ManagementPath(string.Format("\\\\{0}\\root\\cimv2:Win32_Process", remoteHost));
ManagementScope scope = new ManagementScope(path, opts);
scope.Connect();
ObjectGetOptions getOpts = new ObjectGetOptions();
using (ManagementClass mngClass = new ManagementClass(scope, path, getOpts))
{
ManagementBaseObject inParams = mngClass.GetMethodParameters("Create");
inParams["CommandLine"] = commandLine;
ManagementBaseObject outParams = mngClass.InvokeMethod("Create", inParams, null);
}