189 lines
6 KiB
C++
189 lines
6 KiB
C++
#include <windows.h>
|
|
#include <ole2.h>
|
|
#include <docobj.h>
|
|
#include <advpub.h>
|
|
#include <initguid.h>
|
|
#include "msident.h"
|
|
#include "factory.h"
|
|
#include "multiutl.h"
|
|
#include <ocidl.h>
|
|
#include <shlwapi.h>
|
|
#include <shlwapip.h>
|
|
#include <shfusion.h>
|
|
|
|
#ifndef ASSERT
|
|
#ifdef DEBUG
|
|
#define ASSERT Assert
|
|
#else
|
|
#define ASSERT(x)
|
|
#endif
|
|
#endif
|
|
|
|
#define IDENTITY_PASSWORDS
|
|
#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))
|
|
|
|
extern ULONG g_cLock, g_cObj;
|
|
extern HANDLE g_hMutex;
|
|
extern GUID g_uidOldUserId;
|
|
extern GUID g_uidNewUserId;
|
|
extern BOOL g_fNotifyComplete;
|
|
|
|
inline ULONG DllLock() { return ++g_cLock; }
|
|
inline ULONG DllUnlock() { return --g_cLock; }
|
|
inline ULONG DllGetLock() { return g_cLock; }
|
|
|
|
inline ULONG DllAddRef() { return ++g_cObj; }
|
|
inline ULONG DllRelease() { return --g_cObj; }
|
|
inline ULONG DllGetRef() { return g_cObj; }
|
|
|
|
extern UINT WM_IDENTITY_CHANGED;
|
|
extern UINT WM_QUERY_IDENTITY_CHANGE;
|
|
extern UINT WM_IDENTITY_INFO_CHANGED;
|
|
|
|
#define CCH_USERPASSWORD_MAX_LENGTH 16
|
|
#define CCH_USERNAME_MAX_LENGTH CCH_IDENTITY_NAME_MAX_LENGTH
|
|
|
|
//
|
|
// CUserIdentity object
|
|
//
|
|
class CUserIdentity : public IUserIdentity2
|
|
{
|
|
protected:
|
|
ULONG m_cRef;
|
|
GUID m_uidCookie;
|
|
BOOL m_fSaved;
|
|
BOOL m_fUsePassword;
|
|
TCHAR m_szUsername[CCH_USERNAME_MAX_LENGTH];
|
|
TCHAR m_szPassword[CCH_USERPASSWORD_MAX_LENGTH];
|
|
|
|
|
|
public:
|
|
CUserIdentity();
|
|
~CUserIdentity();
|
|
|
|
// IUnknown members
|
|
STDMETHODIMP QueryInterface(REFIID, void **);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// IUserIdentity members
|
|
STDMETHODIMP GetCookie(GUID *puidCookie);
|
|
STDMETHODIMP OpenIdentityRegKey(DWORD dwDesiredAccess, HKEY *phKey);
|
|
STDMETHODIMP GetIdentityFolder(DWORD dwFlags, WCHAR *pszPath, ULONG ulBuffSize);
|
|
STDMETHODIMP GetName(WCHAR *pszName, ULONG ulBuffSize);
|
|
|
|
// IUserIdentity2 members
|
|
STDMETHODIMP GetOrdinal(DWORD* pdwOrdinal);
|
|
STDMETHODIMP SetName(WCHAR *pszName);
|
|
STDMETHODIMP ChangePassword(WCHAR *szOldPass, WCHAR *szNewPass);
|
|
|
|
// Other members
|
|
STDMETHODIMP SetPassword(WCHAR *pszPassword);
|
|
STDMETHODIMP InitFromUsername(TCHAR *pszUsername);
|
|
STDMETHODIMP InitFromCookie(GUID *uidCookie);
|
|
private:
|
|
STDMETHODIMP _SaveUser();
|
|
};
|
|
|
|
//
|
|
// CEnumUserIdentity object
|
|
//
|
|
class CEnumUserIdentity : public IEnumUserIdentity
|
|
{
|
|
protected:
|
|
ULONG m_cRef;
|
|
DWORD m_dwCurrentUser; // Maintain current index into the reg list
|
|
DWORD m_cCountUsers; // number of accounts in the registry
|
|
GUID *m_rguidUsers;
|
|
BOOL m_fInited;
|
|
|
|
public:
|
|
CEnumUserIdentity();
|
|
~CEnumUserIdentity();
|
|
|
|
// IUnknown members
|
|
STDMETHODIMP QueryInterface(REFIID, void **);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// IEnumUserIdentity members
|
|
STDMETHODIMP Next(ULONG celt, IUnknown **rgelt, ULONG *pceltFetched);
|
|
STDMETHODIMP Skip(ULONG celt);
|
|
STDMETHODIMP Reset(void);
|
|
STDMETHODIMP Clone(IEnumUserIdentity **ppenum);
|
|
STDMETHODIMP GetCount(ULONG *pnCount);
|
|
|
|
private:
|
|
// Other methods
|
|
STDMETHODIMP _Init();
|
|
STDMETHODIMP _Init(DWORD dwCurrentUser, DWORD dwCountUsers, GUID *prguidUserCookies);
|
|
STDMETHODIMP _Cleanup();
|
|
};
|
|
|
|
|
|
//
|
|
// CUserIdentityManager object
|
|
//
|
|
class CUserIdentityManager :
|
|
public IUserIdentityManager,
|
|
public IConnectionPoint,
|
|
public IPrivateIdentityManager,
|
|
public IPrivateIdentityManager2
|
|
{
|
|
protected:
|
|
ULONG m_cRef;
|
|
CRITICAL_SECTION m_rCritSect;
|
|
CNotifierList *m_pAdviseRegistry;
|
|
BOOL m_fWndRegistered;
|
|
HWND m_hwnd;
|
|
|
|
public:
|
|
CUserIdentityManager();
|
|
~CUserIdentityManager();
|
|
|
|
// IUnknown members
|
|
STDMETHODIMP QueryInterface(REFIID, void **);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// IUserIdentityManager members
|
|
STDMETHODIMP EnumIdentities(IEnumUserIdentity **ppEnumUserIdentity);
|
|
STDMETHODIMP ManageIdentities(HWND hwndParent, DWORD dwFlags);
|
|
STDMETHODIMP Logon(HWND hwndParent, DWORD dwFlags, IUserIdentity **ppUserIdentity);
|
|
STDMETHODIMP Logoff(HWND hwndParent);
|
|
STDMETHODIMP GetIdentityByCookie(GUID *uidCookie, IUserIdentity **ppUserIdentity);
|
|
|
|
// IConnectionPoint functions
|
|
STDMETHODIMP GetConnectionInterface(IID *pIID);
|
|
STDMETHODIMP GetConnectionPointContainer(IConnectionPointContainer **ppCPC);
|
|
STDMETHODIMP Advise(IUnknown *pUnkSink, DWORD *pdwCookie);
|
|
STDMETHODIMP Unadvise(DWORD dwCookie);
|
|
STDMETHODIMP EnumConnections(IEnumConnections **ppEnum);
|
|
|
|
// IPrivateIdentityManager functions
|
|
STDMETHODIMP CreateIdentity(WCHAR *pszName, IUserIdentity **ppIdentity);
|
|
STDMETHODIMP ConfirmPassword(GUID *uidCookie, WCHAR *pszPassword);
|
|
|
|
// IPrivateIdentityManager2 functions
|
|
STDMETHODIMP CreateIdentity2(WCHAR *pszName, WCHAR *pszPassword, IUserIdentity **ppIdentity);
|
|
STDMETHODIMP DestroyIdentity(GUID *uidCookie);
|
|
STDMETHODIMP LogonAs(WCHAR *pszName, WCHAR *pszPassword, IUserIdentity **ppIdentity);
|
|
STDMETHODIMP SetDefaultIdentity(GUID *uidCookie);
|
|
STDMETHODIMP GetDefaultIdentity(GUID *uidCookie);
|
|
|
|
// Other methods
|
|
STDMETHODIMP QuerySwitchIdentities();
|
|
STDMETHODIMP NotifySwitchIdentities();
|
|
|
|
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
static STDMETHODIMP ClearChangingIdentities();
|
|
|
|
private:
|
|
STDMETHODIMP _NotifyIdentitiesSwitched();
|
|
STDMETHODIMP _QueryProcessesCanSwitch();
|
|
STDMETHODIMP _CreateWindowClass();
|
|
STDMETHODIMP _SwitchToUser(GUID *puidFromUser, GUID *puidToUser);
|
|
STDMETHODIMP _PersistChangingIdentities();
|
|
STDMETHODIMP _LoadChangingIdentities();
|
|
};
|