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