264 lines
6.1 KiB
C++
264 lines
6.1 KiB
C++
|
// 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<CUserPage,IUserPageUI>::SetFrame(pFrame);
|
||
|
|
||
|
if (NULL != _pBag)
|
||
|
{
|
||
|
CComVariant var;
|
||
|
hr = _pBag->Read(UA_PROP_USERLIST, &var, NULL);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
CComQIPtr<ILogonEnumUsers> spUserList(var.punkVal);
|
||
|
if (spUserList)
|
||
|
{
|
||
|
CComPtr<ILogonUser> 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<ILogonEnumUsers> 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<ILogonUser> 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<ILocalMachine> spLocalMachine;
|
||
|
HRESULT hr = spLocalMachine.CoCreateInstance(CLSID_ShellLocalMachine);
|
||
|
if (SUCCEEDED(hr))
|
||
|
hr = spLocalMachine->put_isGuestEnabled(bEnable);
|
||
|
return hr;
|
||
|
}
|