single.php

C# WinUI3[search-ms:]でUNCのアクセスでエクスプローラーが表示されない場合の対処法

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトで[search-ms:]を使って検索状態でエクスプローラーを表示する際にUNC接続の場合に表示されない場合の対処法です。

[search-ms:]はアクセス可能な場所が前提

Windowsエクスプローラーのアドレスに、UNC(\\コンピューター名\共有名)を利用とするとネットワーク上のコンピュータに設定されている共有フォルダーなどに接続ができます。

また[search-ms:UNC名]でプログラム上からプロセスを実行して表示する場合でも利用が可能です。

UNCの場合、資源アクセスにする際のセキュリティでパスワードなどが設定されている場合があります。

Windowsエクスプローラーの場合は、接続前に[アカウント名]や[パスワード]を入力する画面が表示されますが、次のようなコードで別コンピューター内の共有フォルダーを検索しようとすると表示されない場合があります。

string keyword = System.Web.HttpUtility.UrlDecode(dict[key]); 
string location = "\\\\solomon24\\shares3\\";
string queryString = $@"search-ms:query={keyword}&crumb=location:{location}";

ProcessStartInfo processStartInfo = new ProcessStartInfo(queryString); processStartInfo.UseShellExecute = true; Process.Start(processStartInfo);

また、表示されたる場合があるのは事前にエクスプローラーなどで資源アクセスへの資格情報が保存されている場合です。

認証ダイアログを表示したい場合の対処法

色々調べたところ、資格情報が認証されていない場合には先にエクスプローラーを表示することで認証画面が表示されます。

例えば

string location = @"\\solomon24\shares3\";

// 先にフォルダを開く(未認証ならログインダイアログが出る)
Process.Start(new ProcessStartInfo()
{
    FileName = location,
    UseShellExecute = true
});

//その後に検索画面を表示する
string keyword = System.Web.HttpUtility.UrlDecode(dict[key]);
string queryString = $@"search-ms:query={keyword}&crumb=location:{location}";

Process.Start(new ProcessStartInfo()
{
    FileName = queryString,
    UseShellExecute = true
});

かなり力技ですが、未認証の場合に[資格情報の確認]画面が表示されます。

力技と書いたのは、エクスプローラーが2つ表示されるデメリットがあります。

エクスプローラーを表示したくない場合にはバックグラウンドで共有接続を確立させる方法があります。

Process.Start(new ProcessStartInfo()
{
    FileName = "net use",
    Arguments = $@"{location}",
    CreateNoWindow = true,
    UseShellExecute = false
});

この方法でも未認証の場合には、アカウント名やパスワードの入力を促す画面が表示されます。

コードに直書きするのは、危険ですがアカウント名やパスワードをプリセットすることも可能です(実際には試していませんが)

Arguments = $@"{location} /user:<アカウント名> <パスワード>"

これらの方法以外にも Win32 API の WNetAddConnection2A 関数 (winnetwk.h) を使った方法もありますが、事前に共有接続を確立する方法が手軽に実装できたので私は採用しました。

まとめ

今回は、短い記事ですが、WinUI3プロジェクトで[search-ms:]を使って検索状態でエクスプローラーを表示する際にUNC接続の場合に表示されない場合の対処法について紹介しました。

[search-ms:]は、アクセス可能な場所が前提なのでアクセス先の資格情報が未認証の場合、エラーとなりプロセスが実行されません。

そのため事前に、資格情報を認証させておくか共有接続を確立させる手段が必要になります。

WinUI 3 アプリで、[search-ms:]で検索状態でエクスプローラーが実行されない人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です