Share via


IVdsLun::SetMask 方法 (vdshwprv.h)

[從 Windows 8 和 Windows Server 2012 開始,虛擬磁碟服務 COM 介面會由 Windows 記憶體管理 API 取代。

指定未遮罩清單,這是要授與 LUN 存取權的計算機清單。

語法

HRESULT SetMask(
  [in] LPWSTR pwszUnmaskingList
);

參數

[in] pwszUnmaskingList

清單,指定要授與 LUN 存取權的電腦。 此清單是以分號分隔、以NULL結尾、人類可讀取的字串。

如果值為 “”,則所有已連結 HBA 連接埠的電腦都會被授與 LUN 的存取權。

注意 實際上,如果值為 “”,大部分的硬體提供者只會授與本機計算機上的埠和啟動器對 LUN 的存取權。

 

如果值為 “”,則會針對先前授與 LUN 存取權的所有計算機撤銷存取權。

如果指定 「*」 或 「」,則無法指定其他值。

對於光纖通道網路和序列連結的SCSI (SAS) 網路,每個專案都是64位全球名稱 (WWN) ,其中 LUN 會解除遮罩,格式為十六進位字元串, (16 個字元長) ,最重要的位元組優先。 例如,01:23:45:67:89:AB:CD:EF 的 WWN 位址會以 “0123456789ABCDEF” 表示。 如需詳細資訊,請參閱 光纖通道SAS的T10規格。

對於 iSCSI 網路,每個專案都是 iSCSI 限定名稱, (IQN) LUN 解除遮罩的每個啟動器。 未遮罩至特定啟動器的 LUN 會被視為與該啟動器相關聯。

注意 取消遮罩清單可以多次包含相同的 WWN 或 IQN。 呼叫端不應該從清單中移除重複專案,或驗證 WWN 或 iSCSI 名稱的格式。 此外,存取權不是累計的。 換句話說,如果連續呼叫這個方法兩次,則只會授與第二次呼叫中指定的計算機存取權。
 

傳回值

這個方法可以傳回標準 HRESULT 值,例如 E_INVALIDARGE_OUTOFMEMORY,以及 VDS 特定的傳回值。 它也可以使用 HRESULT_FROM_WIN32 宏傳回已轉換的系統錯誤碼。 錯誤可能源自 VDS 本身,或來自正在使用的基礎 VDS 提供者 。 可能的傳回值包括下列專案。

傳回碼/值 Description
VDS_E_PROVIDER_CACHE_CORRUPT
0x8004241FL
這個傳回值會向提供者內快取數位相關信息的軟體或通訊問題發出訊號。 使用 IVdsHwProvider::Reenumerate 方法,後面接著 IVdsHwProvider::Refresh 方法來還原快取。
VDS_E_OBJECT_DELETED
0x8004240BL
LUN 物件已不存在。
VDS_E_OBJECT_STATUS_FAILED
0x80042431L
LUN 處於失敗狀態,且無法執行要求的作業。
VDS_E_ANOTHER_CALL_IN_PROGRESS
0x80042404L
另一項作業正在進行中;此作業無法繼續,直到先前的作業或作業完成為止。

備註

呼叫 SetMask 方法以遮罩 LUN 之前,呼叫端應該卸載對應的磁碟,如下所示。 首先,呼叫 IVdsServiceUninstallDisk::GetDiskIdFromLunInfo 來擷取對應至遮罩 LUN 的磁碟 VDS 對象識別符。 然後使用磁碟的 VDS 對象標識符呼叫 IVdsServiceUninstallDisk::UninstallDisks

Windows Server 2003 和 Windows Server 2003 SP1: 若要卸載對應的磁碟,請執行下列步驟。 請注意,這些步驟在 Windows Server 2003 R2 中已過時。

  1. 找出要遮罩之磁碟上的磁碟區,如下所示:
    1. 針對每個磁碟,呼叫 IVdsDisk::QueryExtents 方法來列舉磁碟範圍。 這個方法會傳回 VDS_DISK_EXTENT 結構的清單。 此結構的 volumeId 成員包含磁碟區 GUID
    2. 呼叫 IVdsSwProvider::QueryPacks 方法來列舉套件,並呼叫 IVdsPack::QueryVolumes 以列舉每個套件中的磁碟區,以列舉軟體提供者所管理的磁碟區。 呼叫 IVdsVolume::GetProperties 以取得每個磁碟 區的VDS_VOLUME_PROP 結構。 這個結構的 標識碼 成員包含磁碟區 GUIDpwszName 成員包含要傳遞至 CreateFile 以取得磁碟區句柄的磁碟區名稱。
    3. 使用藉由呼叫 IVdsDisk::QueryExtents 取得的磁碟區 GUID,判斷您需要從列舉磁碟區清單中取得的磁碟區名稱。
  2. 使用 FSCTL_LOCK_VOLUME 控制程式代碼來鎖定每個磁碟區。 如果 LUN 已移至另一部機器作為完整磁碟區,而另一個應用程式保留磁碟區鎖定,您應該盡可能重試 FSCTL_LOCK_VOLUME 作業,再繼續進行下一個步驟。 不過,如果磁碟區只是因為已刪除而鎖定和卸除,就不需要重試 FSCTL_LOCK_VOLUME 作業。
    注意 此步驟是選擇性的。 此步驟的目的是允許其他可能會保留鎖定的應用程式釋出它們。 即使鎖定作業失敗,您也應該繼續進行下一個步驟。
     
  3. 使用 FSCTL_DISMOUNT_VOLUME 控件程式代碼卸除每個磁碟區。
  4. 如果磁碟區位於基本磁碟上,請使用IOCTL_VOLUME_OFFLINE控制程式代碼 將其 離線。
  5. 使用 SetupDiCallClassInstaller 函式卸載每個磁碟區,並傳遞 InstallFunction 參數的DIF_REMOVE
  6. 使用 SetupDiCallClassInstaller 函式卸載每個磁碟,並傳遞 InstallFunction 參數的DIF_REMOVE
  7. 呼叫 IVdsService::CleanupObsoleteMountPoints 方法,從登錄中移除使用者模式路徑,例如掛接的資料夾和驅動器號指派。

將 LUN 解除遮罩至目標電腦或從目標電腦遮罩之後,該機器上的 LUN 可見度在執行總線重新掃描之前可能不會變更。 目標電腦上的 VDS 應用程式會呼叫 IVdsService::Reenumerate 來起始總線重新掃描。 總線重新掃描的起始是 VDS 應用程式的責任,而不是硬體提供者。

規格需求

需求
最低支援的用戶端 Windows Vista [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限桌面應用程式]
目標平台 Windows
標頭 vdshwprv.h
程式庫 Uuid.lib

另請參閱

IVdsHwProvider::Reenumerate

IVdsHwProvider::Refresh

IVdsLun