天天看點

Windows平台使用VDS擷取主機端IQN

先看一下定義在vds.h中關于iSCSI的VDS Interface:IVdsServiceIscsi

EXTERN_C const IID IID_IVdsServiceIscsi;

    MIDL_INTERFACE("14fbe036-3ed7-4e10-90e9-a5ff991aff01")
    IVdsServiceIscsi : public IUnknown
    {
    public:
        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetInitiatorName( 
            /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppwszIscsiName) = 0;

        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE QueryInitiatorAdapters( 
            /* [out] */ __RPC__deref_out_opt IEnumVdsObject **ppEnum) = 0;

        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetIpsecGroupPresharedKey( 
            /* [unique][in] */ __RPC__in_opt VDS_ISCSI_IPSEC_KEY *pIpsecKey) = 0;

        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetAllIpsecTunnelAddresses( 
            /* [in] */ __RPC__in VDS_IPADDRESS *pTunnelAddress,
            /* [in] */ __RPC__in VDS_IPADDRESS *pDestinationAddress) = 0;

        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetAllIpsecSecurity( 
            /* [in] */ VDS_OBJECT_ID targetPortalId,
            /* [in] */ ULONGLONG ullSecurityFlags,
            /* [unique][in] */ __RPC__in_opt VDS_ISCSI_IPSEC_KEY *pIpsecKey) = 0;

        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetInitiatorSharedSecret( 
            /* [unique][in] */ __RPC__in_opt VDS_ISCSI_SHARED_SECRET *pInitiatorSharedSecret,
            /* [in] */ VDS_OBJECT_ID targetId) = 0;

        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RememberTargetSharedSecret( 
            /* [in] */ VDS_OBJECT_ID targetId,
            /* [unique][in] */ __RPC__in_opt VDS_ISCSI_SHARED_SECRET *pTargetSharedSecret) = 0;

    };           

調用GetInitiatorName即可擷取到IQN

void GetiSCSIIQN(void)
{
    HRESULT hResult = CoInitialize(NULL);
    if (!SUCCEEDED(hResult)) {
        cout << "VDS Service failed hr=%x" << hResult << endl;
        return;
    }

    // %SystemRoot%\System32\vdsldr.exe
    IVdsServiceLoader *pLoader = NULL;
    hResult = CoCreateInstance(CLSID_VdsLoader, NULL, CLSCTX_LOCAL_SERVER, IID_IVdsServiceLoader, (void**)&pLoader);
    if (!SUCCEEDED(hResult)) {
        cout << "CoCreateInstance failed" << endl;
        return;
    }
    IVdsService* pService = NULL;
    hResult = pLoader->LoadService(NULL, &pService);
    if (!SUCCEEDED(hResult)) {
        cout << GetLastError() << endl;
        cout << "LoadService failed: " << hex << hResult << endl;
        return;
    }

    // release pLoader.
    if (pLoader) {
        pLoader->Release();
        pLoader = NULL;
    }

    hResult = pService->WaitForServiceReady();
    if (!SUCCEEDED(hResult)) {
        cout << "WaitForServiceReady failed, Error Code: " << GetLastError() << endl;
        return;
    }

    // Query IVdsServiceIscsi
    IVdsServiceIscsi *iSCSIServer = NULL;
    hResult = pService->QueryInterface(IID_IVdsServiceIscsi, (void**)&iSCSIServer);
    if (!SUCCEEDED(hResult)) {
        cout << "QueryInterface IVdsServiceIscsi failed, Error Code: " << GetLastError() << endl;
        return;
    }

    // Get IQN, Memory Manager must use CoTaskMemAlloc/CoTaskMemFree.
    LPWSTR pInitiatorName = (WCHAR*)CoTaskMemAlloc(sizeof(WCHAR) * MAX_PATH);
    hResult = iSCSIServer->GetInitiatorName(&pInitiatorName);
    if (!SUCCEEDED(hResult)) {
        cout << "GetInitiatorName failed, Error Code: " << GetLastError() << endl;
        if (NULL != pInitiatorName) {
            CoTaskMemFree(pInitiatorName);
            pInitiatorName = NULL;
        }
        return;
    }

    wcout << "Local Machine IQN: " << pIQN << endl;

    if (NULL != pInitiatorName) {
        CoTaskMemFree(pInitiatorName);
        pInitiatorName = NULL;
    }
    return;
}           

運作後,居然抛錯:

GetInitiatorName failed, Error Code: 14007

檢視了一下System Error Code:

System error 14007 has occurred. The requested lookup key was not found in any active activation context.

資訊有點晦澀,但是想起來似乎MSiSCSI服務沒起來,

C:\Users\sha>sc start msiscsi

SERVICE_NAME: msiscsi

TYPE : 20 WIN32_SHARE_PROCESS

STATE : 2 START_PENDING

(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)

WIN32_EXIT_CODE : 0 (0x0)

SERVICE_EXIT_CODE : 0 (0x0)

CHECKPOINT : 0x0

WAIT_HINT : 0x7d0

PID : 464

FLAGS :

再次運作:

Local Machine IQN: iqn.1991-05.com.microsoft:bendsha

繼續閱讀