トップ回答者
グループポリシーに沿ったドライブ一覧の取得について

質問
-
お世話になります。
VC++開発環境でアプリケーションを作成しています。
Windowsのグループポリシーでドライブを見えない(エクスプローラで見るとCやDドライブが表示されない状態)ようにしている環境で、そのポリシーに沿ったドライブ一覧を取得したいのですが、うまくいきません。
※ドライブとして
C: ローカルドライブ
D: ローカルドライブ
N: ネットワークドライブ
R: CDドライブ
があり、Windowsのグループポリシーで「「指定したドライブを[マイコンピュータ]内で非表示にする」でC,D,Rドライブを非表示にしていたとき、ドライブ一覧を取得する関数「GetLogicalDrives()」や「GetLogicalDriveStrings()」を使うと非表示のものも取得してきてしまいます。グループポリシーを通りのドライブ一覧を取得する方法は無いでしょうか?
よろしくお願いします。
回答
-
ドライブの非表示は、あくまでエクスプローラーに対する制約です。
同等の動作を実現するには、(1)制限情報を自分で読み取って、取得されたドライブ一覧から取り除く、(2)エクスプローラー(シェル)と同じものを取得できるインターフェースを使うの2つが考えられます。※以下に書く内容は、裏付けをとっていませんので、外していたら申し訳ありません※
(1)に関しては レジストリの NoDrives かもしれません。
(2)に関しては IShellFolder などを使うと同じようになるかもしれませんが、試せていません。こちらは手間がかかることと、別の要素も出てくるので(1)の方がお手軽かもしれませんね。 -
昨日はバタバタしてて2の方法が試せなかったので、ちょっと試してみました。
レジストリに関しては、Azulean さんの提示したものの通りみたいです。設定したら用意されて未定義にしたら消えました。こちらのレジストリについては、KB231289 にも記載されていますね。
2のほうも試してみました。IShellFolder::EnumObjects できちんと列挙から除外されます。ですので、シェルの機能制限をそのまま甘受する仕組みを利用するなら、シェル経由でファイルシステム等々にアクセスすることで制約事項の設定を個別に調査せずに利用することができます。
CMFCShellTreeCtrl や、CMFCShellListCtrl のソースを参照するとIShellFolder を利用したリストアップなどを行っていますので、こちらをうまく活用することでお望みの仕組みは作り上げることができると思います。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
すべての返信
-
ドライブの非表示は、あくまでエクスプローラーに対する制約です。
同等の動作を実現するには、(1)制限情報を自分で読み取って、取得されたドライブ一覧から取り除く、(2)エクスプローラー(シェル)と同じものを取得できるインターフェースを使うの2つが考えられます。※以下に書く内容は、裏付けをとっていませんので、外していたら申し訳ありません※
(1)に関しては レジストリの NoDrives かもしれません。
(2)に関しては IShellFolder などを使うと同じようになるかもしれませんが、試せていません。こちらは手間がかかることと、別の要素も出てくるので(1)の方がお手軽かもしれませんね。 -
昨日はバタバタしてて2の方法が試せなかったので、ちょっと試してみました。
レジストリに関しては、Azulean さんの提示したものの通りみたいです。設定したら用意されて未定義にしたら消えました。こちらのレジストリについては、KB231289 にも記載されていますね。
2のほうも試してみました。IShellFolder::EnumObjects できちんと列挙から除外されます。ですので、シェルの機能制限をそのまま甘受する仕組みを利用するなら、シェル経由でファイルシステム等々にアクセスすることで制約事項の設定を個別に調査せずに利用することができます。
CMFCShellTreeCtrl や、CMFCShellListCtrl のソースを参照するとIShellFolder を利用したリストアップなどを行っていますので、こちらをうまく活用することでお望みの仕組みは作り上げることができると思います。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/