Windows平台使用VDS获取主机端IQN

来源:互联网 发布:淘宝怎么关联小号 编辑:程序博客网 时间:2024/06/07 03:49

先看一下定义在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

0 0