获取域名和登录名

std::string GetADDomainName()
{
	DWORD dwRet = -1;
	std::string strDomainName;
	LPWSTR pDomainName = NULL;
	std::wstring wstrDomainName;
	NETSETUP_JOIN_STATUS status ;
	BOOL bJoinDomain = FALSE;
	if (NERR_Success == NetGetJoinInformation(NULL,&pDomainName,&status))
	{
		switch(status)
		{
		case NetSetupUnknownStatus:
		case NetSetupUnjoined:
		case NetSetupWorkgroupName:
			break;
		case NetSetupDomainName:
			wstrDomainName = pDomainName;
			bJoinDomain = TRUE;
			break;
		}

		NetApiBufferFree(pDomainName);
	}
	if(bJoinDomain)
	{
		// 检查登录域,终端加入了正确的域,并且登录该域,
		BOOL bIsLogonDomain = FALSE;
		DWORD dwLogonCnt = 0;
		DWORD dwActiveCnt = 0;
		PWTS_SESSION_INFO pInfo = NULL;
		DWORD dwCount = 0;

		if (WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE,0,1,&pInfo,&dwCount))
		{
			for(int i=0;i<dwCount;i++)
			{
				if (pInfo[i].State != WTSActive)
					continue;
				dwActiveCnt++;
				LPTSTR pName = NULL;
				DWORD dwName = 0;
				if (WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE,pInfo[i].SessionId,WTSDomainName,&pName,&dwName))
				{
					std::wstring wstrName = pName;
					if ( wstrDomainName == wstrName)
					{
						dwLogonCnt++;// 登录了指定的域
					}
					else
					{
						// 加入域但没有登录域
					}
					WTSFreeMemory(pName);
				}
			}
			WTSFreeMemory(pInfo);
			if (dwActiveCnt && dwActiveCnt ==dwLogonCnt)//防止所有session都是不活动的。
			{
				bIsLogonDomain = TRUE;// 登录域
			}
		}

		if(bIsLogonDomain)
		{
			CWmiMgr wmimgr;
			if (wmimgr.Initialize())
			{
				wmimgr.ExecClassQuery("select * from Win32_ComputerSystem");
				if (wmimgr.HasObject())
				{
					wmimgr.GetProperty("Domain",strDomainName);
					wmimgr.ReleaseObject();
				}
			}
		}
	}

	return strDomainName;
}

std::string GetLogonName()
{
	std::string logonName;

#ifdef _DEBUG
	CHAR szEchoStr[256];
#endif
	DWORD nCount = 0;
	HRESULT hres;
	// Initialize COM.
	hres =  CoInitialize(NULL);
	if (FAILED(hres))
	{
#ifdef _DEBUG
		sprintf(szEchoStr, "CoInitiaLize: %x", hres);
		OutputDebugStringA(szEchoStr);
#endif
		return logonName;              // Program has failed.
	}

	// Initialize
	hres =  CoInitializeSecurity(
		NULL,    
		-1,      // COM negotiates service                 
		NULL,    // Authentication services
		NULL,    // Reserved
		RPC_C_AUTHN_LEVEL_DEFAULT,    // authentication
		RPC_C_IMP_LEVEL_IMPERSONATE,  // Impersonation
		NULL,             // Authentication info
		EOAC_NONE,        // Additional capabilities
		NULL              // Reserved
		);    
	if (FAILED(hres))
	{
		if(hres != RPC_E_TOO_LATE)
		{
#ifdef _DEBUG
			sprintf(szEchoStr, "CoInitializeSecurity: %x", hres);
			OutputDebugStringA(szEchoStr);
#endif
			CoUninitialize();
			return logonName;
		}
	}

	// Obtain the initial locator to Windows Management
	// on a particular host computer.
	IWbemLocator *pLoc = 0;
	hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
	if (FAILED(hres))
	{
#ifdef _DEBUG
		sprintf(szEchoStr, "CoCreateInstance: %x", hres);
		OutputDebugStringA(szEchoStr);
#endif
		CoUninitialize();
		return logonName;       // Program has failed.
	}


	IWbemServices *pSvc = 0;
	hres = pLoc->ConnectServer(
		_bstr_t(L"ROOT\\CIMV2"), // WMI namespace
		NULL,                    // User name
		NULL,                    // User password
		0,                       // Locale
		NULL,                    // Security flags                
		0,                       // Authority      
		0,                       // Context object
		&pSvc                    // IWbemServices proxy
		);                             
	if (FAILED(hres))
	{
#ifdef _DEBUG
		sprintf(szEchoStr, "ConnectServer: %x", hres);
		OutputDebugStringA(szEchoStr);
#endif
		pLoc->Release();    
		CoUninitialize();
		return logonName;                // Program has failed.
	}


	// Set the IWbemServices proxy so that impersonation
	// of the user (client) occurs.
	hres = CoSetProxyBlanket(
							pSvc,                         // the proxy to set
							RPC_C_AUTHN_WINNT,            // authentication service
							RPC_C_AUTHZ_NONE,             // authorization service
							NULL,                         // Server principal name
							RPC_C_AUTHN_LEVEL_CALL,       // authentication level
							RPC_C_IMP_LEVEL_IMPERSONATE,  // impersonation level
							NULL,                         // client identity
							EOAC_NONE                     // proxy capabilities    
							);

	if (FAILED(hres))
	{
#ifdef _DEBUG
		sprintf(szEchoStr, "CoSetProxyBlanket: %x", hres);
		OutputDebugStringA(szEchoStr);
#endif
		pSvc->Release();
		pLoc->Release();    
		CoUninitialize();
		return logonName;               // Program has failed.
	}
	//
	IEnumWbemClassObject* pEnumerator = NULL;


	hres = pSvc->ExecQuery(
		bstr_t("WQL"),
		bstr_t("SELECT * FROM Win32_ComputerSystem"),
		WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
		NULL,
		&pEnumerator);
	if (FAILED(hres))
	{
#ifdef _DEBUG
		sprintf(szEchoStr, "ExecQuery: %x", hres);
		OutputDebugStringA(szEchoStr);
#endif
		pSvc->Release();
		pLoc->Release();    
		CoUninitialize();
		return logonName;               // Program has failed.
	}
	else
	{
		IWbemClassObject *pclsObj;
		ULONG uReturn = 0;
		char *pstrResult = NULL;


		while (pEnumerator)
		{
			HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,&pclsObj, &uReturn);

			if(0 == uReturn)
			{
				break;
			}

			VARIANT vtUserName;
			// Get the value of the Name property
			hres = pclsObj->Get(L"UserName",0, &vtUserName, 0, 0);
			if(SUCCEEDED(hres))
			{
				if(vtUserName.vt != VT_NULL)
				{
					pstrResult = _com_util::ConvertBSTRToString(vtUserName.bstrVal);
					if(pstrResult)
					{
						//strncpy(szUserName, pstrResult, sizeof(UserIdentifyInfo.szUserName));
						logonName = pstrResult;
						free(pstrResult);
					}
				}
			}

			VariantClear(&vtUserName);
			pclsObj->Release();
		}
	}


	pSvc->Release();
	pLoc->Release();  
	pEnumerator->Release();

	CoUninitialize();

	std::string::size_type tag = logonName.rfind("\\");
	if (std::string::npos != tag)
	{
		logonName = logonName.substr(tag+1);
	}
	return logonName;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值