// UserPage.cpp : Implementation of CUserPage #include "stdafx.h" #include "MainPage.h" #include "UserPage.h" EXTERN_C const CLSID CLSID_UserPage = __uuidof(CUserPage); ///////////////////////////////////////////////////////////////////////////// // CUserPage LPWSTR CUserPage::c_aHTML[] = { L"res://nusrmgr.exe/userpage.htm", L"res://nusrmgr.exe/userpage_sec.htm" }; STDMETHODIMP CUserPage::SetFrame(ITaskFrame* pFrame) { HRESULT hr; ATOMICRELEASE(_pUser); _bSelf = FALSE; _bRunningAsOwner = FALSE; _bRunningAsAdmin = FALSE; hr = CHTMLPageImpl::SetFrame(pFrame); if (NULL != _pBag) { CComVariant var; hr = _pBag->Read(UA_PROP_USERLIST, &var, NULL); if (SUCCEEDED(hr)) { CComQIPtr spUserList(var.punkVal); if (spUserList) { CComPtr spLoggedOnUser; hr = spUserList->get_currentUser(&spLoggedOnUser); var.Clear(); hr = _pBag->Read(UA_PROP_PAGEINITDATA, &var, NULL); if (SUCCEEDED(hr)) { hr = spUserList->item(var, &_pUser); if (SUCCEEDED(hr)) { if (spLoggedOnUser) _bSelf = IsSameAccount(spLoggedOnUser, var.bstrVal); // Clear the pageinit prop var.Clear(); _pBag->Write(UA_PROP_PAGEINITDATA, &var); } } else { _pUser = spLoggedOnUser; if (NULL != _pUser) { _pUser->AddRef(); _bSelf = TRUE; } } if (spLoggedOnUser) { _bRunningAsOwner = IsOwnerAccount(spLoggedOnUser); _bRunningAsAdmin = IsAdminAccount(spLoggedOnUser); } } } } return hr; } STDMETHODIMP CUserPage::Reinitialize(ULONG /*reserved*/) { if (NULL == _pBag || NULL == _pUser) return E_UNEXPECTED; CComVariant var; if (SUCCEEDED(_pBag->Read(UA_PROP_PAGEINITDATA, &var, NULL)) && (VT_BSTR == var.vt) && IsSameAccount(_pUser, var.bstrVal)) { // It's the same user, so this page can be reused as is. // TODO: actually, should reinit in case something has changed and // we need to hide/show different tasks. Also, the UserDisplayHTML // may be out of date. // // Leaving this in for now to verify frame optimizations // Clear the pageinit prop var.Clear(); _pBag->Write(UA_PROP_PAGEINITDATA, &var); return S_OK; } // We could do some more work to re-init the page here. // Failing causes the page to be thrown away and recreated. return E_FAIL; } STDMETHODIMP CUserPage::get_passwordRequired(VARIANT_BOOL *pVal) { if (NULL == pVal) return E_POINTER; *pVal = NULL; if (NULL == _pUser) return E_UNEXPECTED; return _pUser->get_passwordRequired(pVal); } STDMETHODIMP CUserPage::get_isAdmin(VARIANT_BOOL *pVal) { if (NULL == _pUser) return E_UNEXPECTED; return _GetBool((_bSelf ? _bRunningAsAdmin : IsAdminAccount(_pUser)), pVal); } STDMETHODIMP CUserPage::get_isGuest(VARIANT_BOOL *pVal) { if (NULL == _pUser) return E_UNEXPECTED; return _GetBool(IsGuestAccount(_pUser), pVal); } STDMETHODIMP CUserPage::get_isOwner(VARIANT_BOOL *pVal) { if (NULL == _pUser) return E_UNEXPECTED; return _GetBool(IsOwnerAccount(_pUser), pVal); } STDMETHODIMP CUserPage::get_userDisplayName(BSTR *pVal) { if (NULL == pVal) return E_POINTER; *pVal = NULL; if (NULL == _pUser) return E_UNEXPECTED; *pVal = GetUserDisplayName(_pUser); return S_OK; } STDMETHODIMP CUserPage::createUserDisplayHTML(BSTR *pVal) { if (NULL == pVal) return E_POINTER; *pVal = NULL; if (NULL == _pUser) return E_UNEXPECTED; LPWSTR pszHTML = CreateUserDisplayHTML(_pUser); if (NULL != pszHTML) { *pVal = SysAllocString(pszHTML); LocalFree(pszHTML); } return S_OK; } STDMETHODIMP CUserPage::countOwners(UINT *pVal) { if (NULL == pVal) return E_POINTER; *pVal = 0; if (NULL == _pBag) return E_UNEXPECTED; CComVariant var; HRESULT hr = _pBag->Read(UA_PROP_USERLIST, &var, NULL); if (SUCCEEDED(hr)) { // The user list is saved as VT_UNKNOWN hr = CountOwners(var.punkVal, pVal); } return hr; } STDMETHODIMP CUserPage::enableGuest(VARIANT_BOOL bEnable) { if (NULL == _pTaskFrame) return E_UNEXPECTED; HRESULT hr = EnableGuest(bEnable); if (SUCCEEDED(hr)) hr = _pTaskFrame->ShowPage(CLSID_MainPage, TRUE); return hr; } HRESULT CountOwners(IUnknown* punkUserList, UINT *pVal) { if (NULL == pVal) return E_POINTER; *pVal = 0; if (NULL == punkUserList) return E_INVALIDARG; UINT cOwners = 0; CComQIPtr spUserList(punkUserList); if (spUserList) { // Note that 'Administrator' is not included in the count. // Note also that we don't really need a true count, we only // need to know whether there is 0, 1, or many. Therefore, we // always stop counting at 2. UINT cUsers = 0; spUserList->get_length(&cUsers); VARIANT var; var.vt = VT_I4; for (UINT i = 0; i < cUsers && cOwners < 2; i++) { CComPtr spUser; var.lVal = i; spUserList->item(var, &spUser); if (spUser && IsOwnerAccount(spUser) && !IsAdminAccount(spUser)) ++cOwners; } } *pVal = cOwners; return S_OK; } HRESULT EnableGuest(VARIANT_BOOL bEnable) { CComPtr spLocalMachine; HRESULT hr = spLocalMachine.CoCreateInstance(CLSID_ShellLocalMachine); if (SUCCEEDED(hr)) hr = spLocalMachine->put_isGuestEnabled(bEnable); return hr; }