問題タブ [removable-storage]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 新しいドライブがUSBまたはその他の手段(C#)を介して接続されたときに通知を受け取る
USBポートやFirewireポートなどを介して新しいドライブがWindowsシステムに接続されたことを検出する必要があります。WM_DEVICECHANGEメッセージを認識していますが、これを使用するにはウィンドウを開く必要があります。新しいドライブが接続されたことを検出するバックグラウンドプロセスをC#で作成する方法はありますか?
背景情報:会社のリムーバブルドライブからワームを削除するためにこのアプリを作成したいと思います。通常のウイルス対策ソフトウェアはそれを削除できません。ワームを削除するスクリプトがありますが、手動で実行する必要があります。これは、発生を封じ込めるには十分ではありません。
delphi - フラッシュ デバイスの一意のシリアル番号を見つける方法は?
USB フラッシュ ドライブの挿入と取り外しを検出できるスニペットと .pas ファイルをいくつか見つけました。あらゆる種類の優れた情報を提供するものもありますが、必要なのは、ボリュームのシリアル番号ではなく、デバイスの一意のシリアル番号です。
私の現在の .pas ファイル (どこで見つけたか覚えていません) も、SD カードを検出しているようです (これが気に入っています)。見たい場合は、ここで見つけることができます(ドライブ番号と挿入/削除のみが返されます):
PSコードの強調表示は失敗です。
概して; リムーバブルの挿入/取り外し時に、ドライブ文字と固有のシリアル番号を取得します。おそらく、既に指定されたコードを WMI 呼び出し "where Index=found_index" と組み合わせます。
****編集!**** RRUZ から提供されたコードの "where" 句を削除しました。最終的に配列の処理方法を見つけたので、それを使用して Capabilities[i]=7 を見つけ、すべてのリムーバブル メディアを取得します。このコードを上記のコードに接続するだけです。Indexの利用を考えているのですが、GetDrive MapInfoの使い方がわかりません。ドライブ文字を取得する例を教えていただければ、私の質問は解決しました。
delphi - リムーバブルデバイスを常に検出するための最良の方法
以前の質問で「フラッシュデバイスの一意のシリアル番号を見つける方法は?」ドライブ文字を取得する方法を尋ねることになりました。その問題は解決されました。
しかし、私の最初の質問には答えられていません。リムーバブルデバイス(USBドライブ、SDカード、(外付けHDD?)など)を区別し、再接続したときに常に認識できるようにしたかったのです。これは他のコンピュータでも可能です。幸い、ドライブがフォーマットされているかどうかは気にしないので(プログラムで新しいドライブとして扱われる場合)、認識の一部としてパーティションIDとボリュームIDを使用できますか?PNPDeviceIDは一意ではないため、これを求めています。私はそれを読んでいるハードウェアに依存することを発見しました、下の写真を見てください:
したがって、私が探しているのは、Win32_DiskDrive、Win32_DiskPartition、Win32_LogicalDiskを使用して、任意のコンピューター上の任意のリムーバブルデバイスを検出および認識する方法です。元のコードについてRRUZに感謝します。
編集
ドライブが挿入されたときにドライブを検出するコードはすでに機能していることを追加する必要がありますが、ドライブ文字しか表示されません。そのドライブ文字を使用して、WMIから他のすべての情報を取得します。
最終編集
私は、開発者が認識のためにパーティション/ボリュームIDを安全に使用できることを読みました。頼りにできますか?
解決策:
つまり、「一意の」IDを読み取ることは実行可能な解決策ではないため、これを回避するには2つの方法があります。
- プログラムが認識できる一意のIDを使用して隠しファイルをドライブに保存します(ローカルデータベースと比較してください)。
- ドライブに関連するすべてのものを非表示の設定ファイルの形式でドライブに保存します。プログラム自体には設定がないので、このアプローチを採用しました。すべての設定はパーティションごとです。これにより、設定/プログラムも移植可能になります。
wmi - きれいな (メーカーフリーの) デバイス名はどこにありますか?
(リムーバブル) デバイスに関連することを検討しているので、WMI やその他の API、[デバイスとプリンター] 画面、およびハードウェアの安全な取り外しポップアップを調べていました。ただし、問題は、ユーザーが自分の PC で名前を「知っている」ため、名前を取得する方法が見つからないことです。
例... iPod を接続すると、DaP と SRH の両方で「iPod」と表示されます。WMI で見つけた最も近いものは、'Apple Inc. iPod' と 'Apple iPod USB Device' です。同様の話は、WD My Book などの他のハードウェアにも当てはまります。適切な文字列はどこにありますか?
私は WMI を使って正しい方向から全体像にアプローチしているかどうか疑問に思っているので、もう少し説明を加えます... このあたりのリムーバブル ハードウェア (99% のディスク ドライブ) でかなりのことを行っています。AからZまでのループをハードコーディングして各ドライブを検査することを考えましたが、私の知る限り、リムーバブルボリュームはレターにマウントする必要はありませんが、ntfsの空のフォルダーにダンプすることもできます. それと、プラグを抜く前に「ファイナライズ」が必要な他の(ドライブ以外の)ハードウェアがあるかもしれないという私の小さな疑いは、私がまったく間違った質問をしているかもしれないという小さなしつこい疑いに追加されています。(編集者:これがあまりにも無関係な情報である場合は、遠慮なく編集してください。)
c++ - リムーバブル ドライブ (USB フラッシュ ドライブなど) の検出 C/C++
リムーバブル ディスク ドライブがシステムに接続 (切断) されていることをどのように検出できますか? マウント パス (Linux の場合) とドライブ文字 (Windows の場合) を取得するにはどうすればよいですか?
編集:現在接続されているデバイスを検出する方法はありますか?
windows - ターミナル サービス セッションでのリムーバブル ドライブへのアクセス
ドライブがシステムに追加されたとき、またはメディアがドライブに挿入されたときに(SHChangeNotifyRegister経由で)通知を受け取るためにシェルに登録するトレイアプリケーションがあります。これらの通知を受け取ったら、ドライブを開いてプロパティを照会しようとします。私のテストでは、単純な USB フラッシュ ドライブを使用しています。これは、物理コンソールでログオンしている場合は正常に機能しますが、リモート デスクトップ経由でログオンしている場合、CreateFile 呼び出しは ERROR_ACCESS_DENIED で失敗します。
私は CreateFile を次のように呼び出しています。
ここで、szDrive の形式は"\\\\.\\G:"
です。この後、いくつかの DeviceIoControl 呼び出しを行います。
奇妙なことに、これで Process Monitor を実行しましたが、リモート デスクトップのシナリオでは、トレイ アプリケーションからドライブに CreateFile のレコードがありません。ログ ファイルを書き込み、プロセス モニター ログにログ ファイルの CreateFile 呼び出しが表示されるので、トレイ アプリがそれを呼び出していることがわかります。Process Monitor に引っかかるほどには進んでいないようです。
マシンはすべてデフォルト設定 (つまり UAC) の Windows 7 です。私のアカウントはローカル管理者です。両方のシナリオ (ローカル デスクトップとリモート デスクトップ) で、トレイ アプリを標準ユーザー (昇格なし) として実行しています。ただし、トレイ アプリを昇格させると、リモート デスクトップ シナリオはドライブを開くことに成功します。
これは、私たちがサポートしないシナリオになる可能性がありますが、ここで何が起こっているのか知りたいです. 何か案は?
EDIT 1:これをもう一度見てみると、(リムーバブルドライブだけでなく)すべてのドライブで発生しているようです。観察された動作は同じです: CreateFile が ERROR_ACCESS_DENIED で失敗し、Process Monitor にログがありません。
編集 2: リモート ログオンが読み取りアクセスを拒否されているようです。GENERIC_READ を 0 に置き換えると、ドライブが正常に開かれます (ただし、DeviceIoControl 呼び出しは ERROR_ACCESS_DENIED で失敗します)。リモートログオンにドライブへの読み取りアクセスを許可できるかどうかを確認しようとして、WinObj をいじっています。
c++ - Windowsメッセージを使用してドライブへのメディアの挿入を検出します
現在、WM_DEVICECHANGEを使用して、新しいUSBドライブがコンピューターに接続されたときに通知を受け取ります。これは、デバイスが到着するとすぐにファイルを読み取る準備ができているサムドライブなどのデバイスに最適です。SDカードリーダーなどのデバイスの場合、デバイスが接続されたときにメッセージが1回送信されるためではなく、ユーザーが実際にデバイスにカードを挿入したときにメッセージが送信されないためです。
ポーリングを使用せずに、既存のUSBデバイスへの新しいメディアの挿入を検出することは可能ですか?
.net - メモリーカード情報
メモリーカード(リムーバブルメディア)の挿入を検知しています。挿入されたメディアに関する情報 (タイプ、メーカーなど) を取得できますか?
c# - SD カードの検索
プログラムで SD カードの検索を実装する必要があります。
現在、次のようなすべてのリムーバブル デバイスの検索を使用しています。
ただし、USB フラッシュ ドライブも検出されます。SDカードのみを見つける適切な方法はありますか? 私が必要とするのは、一般に、利用可能な SD カードのドライブ文字 (「F:」など) だけです。
winapi - Windows エクスプローラーの「取り出し」機能と同様に、USB リムーバブル ディスク/ボリュームを取り出す方法は?
Windows がリムーバブル ボリュームのシェル コンテキスト メニューで使用できる「取り出し」機能を実行するために使用する API、または一連の API 呼び出しを知っていますか?
これまでのところ、次の 2 つのことを試しました。
CM_Request_Device_Ejectを使用して、( SetupDiXXX APIを使用して) リムーバブル ディスクを列挙し、関心のあるディスクを見つけ、( CM_XXX APIを使用して) デバイス マネージャー階層をたどり、最後に、関心のあるデバイスの を呼び出し
CM_Request_Device_Eject
ますdevInst
。これは、マイ コンピュータからボリュームを削除し、デバイスを「安全に削除できる」(削除できる状態にする) という意味で機能しますが、シェル コンテキスト メニューの「取り出し」機能とは異なります。これを知る方法は、イジェクトしようとしているデバイスが、イジェクト時に何かを実行するはずであり、 を使用してイジェクトを実行しても何も起こらないためCM_Request_Device_Eject
です。IOCTL_STORAGE_EJECT_MEDIA制御コードでDeviceIoControlを使用します。イベントのシーケンスは次のとおりです。
- ドキュメントで提案されているように、CreateFileを使用して関心のあるボリュームへのハンドルを取得する
- FSCTL_LOCK_VOLUMEでボリュームをロックしてみてください
- FSCTL_DISMOUNT_VOLUMEを使用してマウント解除してみてください
- IOCTL_STORAGE_MEDIA_REMOVALを使用してストレージ メディアの取り外しを防止する機能を無効にします。
- 最後にIOCTL_STORAGE_EJECT_MEDIA関数を実行します。
これはまったく機能しません。各呼び出しは(0x00000001)
DeviceIoControl
で失敗します。ERROR_IVALID_FUNCTION
通話が失敗する理由がわかりません。DeviceIoControl への他の呼び出しが同じファイル ハンドル ( IOCTL_STORAGE_GET_DEVICE_NUMBERなど)に対して正常に機能することを確認しました。
最後に、私の開発マシンは Windows 7 x64 を実行しており、2 番目の方法を機能させるために、管理者権限でアプリケーションを実行しようとしましたが、何も変わりませんでした。
編集
最終的に、アプローチ 2 のどこで間違いを犯していたのかがわかりました。を使用してボリュームへのハンドルを開くときに、何らかの理由で目的のアクセスを正しく設定していなかったことが判明しましたCreateFile
。正しいアクセス モードはGENERIC_READ | GENERIC_WRITE
で、0 を渡していました。エラーを修正した後、 を使用してデバイスを正常に取り出すことができました。DeviceIoControl - IOCTL_STORAGE_EJECT_MEDIA
また、方法 #1 を使用してCM_Request_Device_Eject
.
そして、メソッド #2 は、実際にシェル コンテキスト メニューの "Eject" 機能で使用されるメソッドであることがわかります。この方法を使用すると、デバイスは正しく反応します。