MS-DOS デバイス名の定義
MS-DOS デバイス名は、MS-DOS デバイスのパスを指すジャンクションです。 これらのジャンクションは、MS-DOS デバイス名前空間を構成します。 これらのジャンクションを作成および変更するには、 DefineDosDevice 関数と SetVolumeMountPoint 関数を呼び出します。 DeleteVolumeMountPoint は SetVolumeMountPoint によって作成されたジャンクションを削除し、 DefineDosDevice は作成したジャンクションを削除します。
MS-DOS デバイス名を定義した後も、すべてのプロセスで表示されたままになります。
- すべての MS-DOS デバイスは、認証 ID を介して Windows によって識別されます。 認証 ID は、作成時に各ログオン セッションに関連付けられた LUID (ローカル一意識別子) です。
- MS-DOS デバイス名の可視性は、グローバルまたはローカルのいずれかに分類され、グローバル MS-DOS デバイスとローカル MS-DOS デバイス名前空間に含まれることによって定義されます。 グローバル名前空間内の MS-DOS デバイスの内容には、すべてのユーザーがアクセスできます。また、ローカル名前空間内の MS-DOS デバイスの内容には、そのローカル MS-DOS デバイス名前空間に関連付けられている AuthenticationID を含むアクセス トークンを持つユーザーのみがアクセスできます。
複数のローカル MS-DOS デバイス名前空間と、一度に 1 台のコンピューター上に存在するグローバル MS-DOS デバイス名前空間は 1 つだけです。
LocalSystem コンテキストで実行されているプロセスのみが DefineDosDevice を呼び出して、グローバル MS-DOS デバイス名前空間に MS-DOS デバイスを作成できることに注意してください。 また、特定の AuthenticationID に対応するローカル MS-DOS デバイス名前空間は、その AuthenticationID への最後の参照が削除されると削除されます。
コードで QueryDosDevice を呼び出して既存の MS-DOS デバイス名を照会すると、最初にローカル MS-DOS デバイス名前空間が検索されます。 それが見つからない場合、関数はグローバル MS-DOS デバイス名前空間を検索します。 コードでこの関数を使用して既存のすべての MS-DOS デバイス名を照会する場合、返される名前の一覧は、LocalSystem コンテキストで実行されているかどうかによって異なります。 その場合は、グローバル MS-DOS デバイス名前空間に含まれる MS-DOS デバイス名のみが返されます。 そうでない場合は、グローバルおよびローカル MS-DOS デバイス名前空間内のデバイス名の連結が返されます。 両方の名前空間にデバイス名が存在する場合、 QueryDosDevice はローカル MS-DOS デバイス名前空間のエントリを返します。 これは、 GetLogicalDrives と GetLogicalDriveStrings によって返されるすべての MS-DOS デバイス名の一覧にも適用 されます。
次のシナリオが発生する可能性があることに注意してください。
- LocalSystem コンテキスト内で実行されていないユーザー A は、対応するローカル MS-DOS デバイス名前空間にデバイス名を作成し、そのデバイス名がグローバル MS-DOS デバイス名前空間に存在しません。
- LocalSystem コンテキスト内で実行されているユーザー B は、グローバル MS-DOS デバイス名前空間に同じデバイス名を作成します。
このシナリオでは、ユーザー A は、ローカル MS-DOS デバイス名前空間内のデバイス名を削除または名前変更するまで、グローバル MS-DOS デバイス名前空間のデバイス名にアクセスできません。 このシナリオが発生する可能性を減らすために、MS-DOS ドライブ文字は、C: で始まり、Z: で終わるグローバル MS-DOS デバイス名前空間に割り当てる必要があります。 ローカル MS-DOS デバイス名前空間で MS-DOS ドライブ文字を割り当てる場合は、このシーケンスを逆にする必要があります。
LocalSystem コンテキスト内で実行していない場合、デバイス名がローカルまたはグローバル MS-DOS デバイス名前空間に既に存在する場合、 DefineDosDevice はローカル MS-DOS デバイス名前空間にデバイス名を定義できません。 DefineDosDevice を呼び出す前に QueryDosDevice を呼び出して、定義するデバイス名が MS-DOS デバイス名前空間に存在するかどうかを判断します。
関連トピック