|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1993 - 1999.
//
// File: UserOM.h
//
// Contents: shell user object model (interface implemtation for ILogonEnumUsers, ILogonUser)
//
//----------------------------------------------------------------------------
#ifndef _USEROM_H_
#define _USEROM_H_
#include "priv.h"
#include "CIDispatchHelper.h"
#include "UIHostIPC.h"
#include "CInteractiveLogon.h"
HRESULT _IsGuestAccessMode(void);
const TCHAR CDECL c_szRegRoot[] = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Hints"); const TCHAR CDECL c_szPictureSrcVal[] = TEXT("PictureSource");
// prototypes for class factory functions
STDAPI CLogonEnumUsers_Create(REFIID riid, void** ppvObj); STDAPI CLocalMachine_Create(REFIID riid, void** ppvObj); STDAPI CLogonStatusHost_Create(REFIID riid, void** ppvObj); STDAPI CLogonUser_Create(REFIID riid, void** ppvObj);
class CLogonEnumUsers : public CIDispatchHelper, public IEnumVARIANT, public ILogonEnumUsers {
public: // *** IUnknown methods ***
virtual STDMETHODIMP_(ULONG) AddRef(void); virtual STDMETHODIMP_(ULONG) Release(void); virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
// *** IDispatch methods ***
virtual STDMETHODIMP GetTypeInfoCount(UINT * pctinfo); virtual STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo); virtual STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid); virtual STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr);
// *** IEnumVARIANT methods ***
virtual STDMETHODIMP Next(ULONG cUsers, VARIANT* rgvar, ULONG* pcUsersFetched); virtual STDMETHODIMP Skip(ULONG cUsers); virtual STDMETHODIMP Reset(); virtual STDMETHODIMP Clone(IEnumVARIANT** ppenum);
// *** ILogonEnumUsers ***
virtual STDMETHODIMP get_Domain(BSTR* pbstr); virtual STDMETHODIMP put_Domain(BSTR bstr); virtual STDMETHODIMP get_EnumFlags(ILUEORDER* porder); virtual STDMETHODIMP put_EnumFlags(ILUEORDER order); virtual STDMETHODIMP get_length(UINT* pcUsers); virtual STDMETHODIMP get_currentUser(ILogonUser** ppLogonUserInfo); virtual STDMETHODIMP item(VARIANT varUserId, ILogonUser** ppLogonUserInfo); virtual STDMETHODIMP _NewEnum(IUnknown** ppunk);
virtual STDMETHODIMP create(BSTR bstrLoginName, ILogonUser **ppLogonUser); virtual STDMETHODIMP remove(VARIANT varUserId, VARIANT varBackupPath, VARIANT_BOOL *pbSuccess); public: // friend functions
friend HRESULT CLogonEnumUsers_Create(REFIID riid, void** ppvObj);
private: // private member variables
int _cRef;
TCHAR _szDomain[256]; // name of the domain we are enumerating users on
ILUEORDER _enumorder; // order in which to enumerate users
HDPA _hdpaUsers; // dpa holding the list of enumerated users
// private member functions
HRESULT _EnumerateUsers(); HRESULT _GetUserByIndex(LONG lUserID, ILogonUser** ppLogonUserInfo); HRESULT _GetUserByName(BSTR bstrUserName, ILogonUser** ppLogonUserInfo); void _DestroyHDPAUsers(); CLogonEnumUsers(); ~CLogonEnumUsers(); };
class CLogonUser : public CIDispatchHelper, public ILogonUser {
public: static HRESULT Create(LPCTSTR pszLoginName, LPCTSTR pszFullName, LPCTSTR pszDomain, REFIID riid, LPVOID* ppv);
// *** IUnknown methods ***
virtual STDMETHODIMP_(ULONG) AddRef(void); virtual STDMETHODIMP_(ULONG) Release(void); virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
// *** IDispatch methods ***
virtual STDMETHODIMP GetTypeInfoCount(UINT * pctinfo); virtual STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo); virtual STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid); virtual STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr);
// *** ILogonUser ***
virtual STDMETHODIMP get_setting(BSTR bstrName, VARIANT* pvarVal); virtual STDMETHODIMP put_setting(BSTR bstrName, VARIANT varVal); virtual STDMETHODIMP get_isLoggedOn(VARIANT_BOOL* pbLoggedIn); virtual STDMETHODIMP get_passwordRequired(VARIANT_BOOL* pbPasswordRequired); virtual STDMETHODIMP get_interactiveLogonAllowed(VARIANT_BOOL *pbInteractiveLogonAllowed); virtual STDMETHODIMP get_isProfilePrivate(VARIANT_BOOL* pbPrivate); virtual STDMETHODIMP get_isPasswordResetAvailable(VARIANT_BOOL* pbResetAvailable);
virtual STDMETHODIMP logon(BSTR pstrPassword, VARIANT_BOOL* pbRet); virtual STDMETHODIMP logoff(VARIANT_BOOL* pbRet); virtual STDMETHODIMP changePassword(VARIANT varNewPassword, VARIANT varOldPassword, VARIANT_BOOL* pbRet); virtual STDMETHODIMP makeProfilePrivate(VARIANT_BOOL bPrivate); virtual STDMETHODIMP getMailAccountInfo(UINT uiAccountIndex, VARIANT *pvarAccountName, UINT *pcUnreadMessages);
private:
// private member variables
int _cRef; TCHAR _szLoginName[UNLEN + sizeof('\0')]; TCHAR _szDomain[DNLEN + sizeof('\0')]; BSTR _strDisplayName; TCHAR _szPicture[MAX_PATH+7]; // +7 for "file://" prefix
BSTR _strPictureSource; BSTR _strHint; BSTR _strDescription; BOOL _bPasswordRequired; int _iPrivilegeLevel; LPTSTR _pszSID;
// private member functions
CLogonUser(LPCTSTR pszLoginName, LPCTSTR pszFullName, LPCTSTR pszDomain); ~CLogonUser();
HRESULT _InitPicture(); HRESULT _SetPicture(LPCTSTR pszNewPicturePath); DWORD _OpenUserHintKey(REGSAM sam, HKEY *phkey);
HRESULT _UserSettingAccessor(BSTR bstrName, VARIANT *pvarVal, BOOL bPut);
// DisplayName
HRESULT _GetDisplayName(VARIANT* pvar); HRESULT _PutDisplayName(VARIANT var);
// LoginName
HRESULT _GetLoginName(VARIANT* pvar); HRESULT _PutLoginName(VARIANT var);
// Domain
HRESULT _GetDomain(VARIANT* pvar);
// Picture
HRESULT _GetPicture(VARIANT* pvar); HRESULT _PutPicture(VARIANT var); HRESULT _GetPictureSource(VARIANT* pvar);
// Description
HRESULT _GetDescription(VARIANT* pvar); HRESULT _PutDescription(VARIANT var);
// Hint
HRESULT _GetHint(VARIANT* pvar); HRESULT _PutHint(VARIANT var);
// AccountType
HRESULT _GetAccountType(VARIANT* pvar); HRESULT _PutAccountType(VARIANT var);
// SID
HRESULT _LookupUserSid(); HRESULT _GetSID(VARIANT* pvar);
//
DWORD _GetExpiryDays (HKEY hKeyCurrentUser); HRESULT _GetUnreadMail(VARIANT* pvar); };
class CLocalMachine : public CIDispatchHelper, public ILocalMachine { public: // *** IUnknown methods ***
virtual STDMETHODIMP_(ULONG) AddRef(void); virtual STDMETHODIMP_(ULONG) Release(void); virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
// *** IDispatch methods ***
virtual STDMETHODIMP GetTypeInfoCount(UINT * pctinfo); virtual STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo); virtual STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid); virtual STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr);
// *** ILocalMachine ***
virtual STDMETHODIMP get_MachineName(VARIANT* pvar); virtual STDMETHODIMP get_isGuestEnabled(ILM_GUEST_FLAGS flags, VARIANT_BOOL* pbEnabled); virtual STDMETHODIMP get_isFriendlyUIEnabled(VARIANT_BOOL* pbEnabled); virtual STDMETHODIMP put_isFriendlyUIEnabled(VARIANT_BOOL bEnabled); virtual STDMETHODIMP get_isMultipleUsersEnabled(VARIANT_BOOL* pbEnabled); virtual STDMETHODIMP put_isMultipleUsersEnabled(VARIANT_BOOL bEnabled); virtual STDMETHODIMP get_isRemoteConnectionsEnabled(VARIANT_BOOL* pbEnabled); virtual STDMETHODIMP put_isRemoteConnectionsEnabled(VARIANT_BOOL bEnabled); virtual STDMETHODIMP get_AccountName(VARIANT varAccount, VARIANT* pvar); virtual STDMETHODIMP get_isUndockEnabled(VARIANT_BOOL* pbEnabled); virtual STDMETHODIMP get_isShutdownAllowed(VARIANT_BOOL* pbShutdownAllowed); virtual STDMETHODIMP get_isGuestAccessMode(VARIANT_BOOL* pbForceGuest); virtual STDMETHODIMP get_isOfflineFilesEnabled(VARIANT_BOOL *pbEnabled);
virtual STDMETHODIMP TurnOffComputer(void); virtual STDMETHODIMP SignalUIHostFailure(void); virtual STDMETHODIMP AllowExternalCredentials(void); virtual STDMETHODIMP RequestExternalCredentials(void); virtual STDMETHODIMP LogonWithExternalCredentials(BSTR pstrUsername, BSTR pstrDomain, BSTR pstrPassword, VARIANT_BOOL* pbRet); virtual STDMETHODIMP InitiateInteractiveLogon(BSTR pstrUsername, BSTR pstrDomain, BSTR pstrPassword, DWORD dwTimeout, VARIANT_BOOL* pbRet); virtual STDMETHODIMP UndockComputer(void); virtual STDMETHODIMP EnableGuest(ILM_GUEST_FLAGS flags); virtual STDMETHODIMP DisableGuest(ILM_GUEST_FLAGS flags);
public: // friend Functions
friend HRESULT CLocalMachine_Create(REFIID riid, LPVOID* ppv);
private: // private member variables
int _cRef;
private: // private member functions
CLocalMachine(void); ~CLocalMachine();
static void RefreshStartMenu(void); };
class CLogonStatusHost : public CIDispatchHelper, public ILogonStatusHost { public: // *** IUnknown methods ***
virtual STDMETHODIMP_(ULONG) AddRef(void); virtual STDMETHODIMP_(ULONG) Release(void); virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
// *** IDispatch methods ***
virtual STDMETHODIMP GetTypeInfoCount(UINT * pctinfo); virtual STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo); virtual STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid); virtual STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr);
// *** ILogonStatusHost ***
virtual STDMETHODIMP Initialize(HINSTANCE hInstance, HWND hwndHost); virtual STDMETHODIMP WindowProcedureHelper(HWND hwnd, UINT uMsg, VARIANT wParam, VARIANT lParam); virtual STDMETHODIMP UnInitialize(void);
public: // friend Functions
friend HRESULT CLogonStatusHost_Create(REFIID riid, LPVOID* ppv);
private: // implementation helpers
LRESULT Handle_WM_UISERVICEREQUEST (WPARAM wParam, LPARAM lParam); LRESULT Handle_WM_WTSSESSION_CHANGE (WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK StatusWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // terminal service wait helpers
bool IsTermServiceDisabled (void); void StartWaitForTermService (void); void EndWaitForTermService (void); void WaitForTermService (void); static DWORD WINAPI CB_WaitForTermService (void *pParameter); // parent process wait helpers
void StartWaitForParentProcess (void); void EndWaitForParentProcess (void); void WaitForParentProcess (void); static DWORD WINAPI CB_WaitForParentProcess (void *pParameter); // thread helper
static void CALLBACK CB_WakeupThreadAPC (ULONG_PTR dwParam); private: // private member variables
int _cRef;
HINSTANCE _hInstance; HWND _hwnd; HWND _hwndHost; ATOM _atom; BOOL _fRegisteredNotification; HANDLE _hThreadWaitForTermService; HANDLE _hThreadWaitForParentProcess; HANDLE _hProcessParent; CInteractiveLogon _interactiveLogon;
static const WCHAR s_szTermSrvReadyEventName[]; public: // private member functions
CLogonStatusHost(void); ~CLogonStatusHost();
};
#endif // _USEROM_H_
|