712 lines
14 KiB
C
712 lines
14 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1994-1998 Microsoft Corporation
|
||
|
|
||
|
Module Name :
|
||
|
|
||
|
usrbrows.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
User Browser Dialog definitions
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Ronald Meijer (ronaldm)
|
||
|
|
||
|
Project:
|
||
|
|
||
|
Internet Services Manager
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _USRBROWS_H
|
||
|
#define _USRBROWS_H
|
||
|
|
||
|
#ifndef _GETUSER_H_
|
||
|
extern "C"
|
||
|
{
|
||
|
#define _NTSEAPI_ // We already have the security API hdrs
|
||
|
#include <getuser.h>
|
||
|
}
|
||
|
#endif // _GETUSER_H_
|
||
|
|
||
|
#ifndef _SHLOBJ_H_
|
||
|
#include <shlobj.h>
|
||
|
#endif // _SHLOBJ_H_
|
||
|
|
||
|
|
||
|
|
||
|
BOOL COMDLL
|
||
|
GetIUsrAccount(
|
||
|
IN LPCTSTR lpstrServer,
|
||
|
IN CWnd * pParent,
|
||
|
OUT CString & str
|
||
|
);
|
||
|
|
||
|
DWORD COMDLL
|
||
|
VerifyUserPassword(
|
||
|
IN LPCTSTR lpstrUserName,
|
||
|
IN LPCTSTR lpstrPassword
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
class COMDLL CAccessEntry : public CObjectPlus
|
||
|
/*++
|
||
|
|
||
|
Class Description:
|
||
|
|
||
|
An access description entry, containing a SID and ACCESS mask
|
||
|
of rights specifically granted.
|
||
|
|
||
|
Public Interface:
|
||
|
|
||
|
LookupAccountSid : Resolve account name to SID
|
||
|
|
||
|
CAccessEntry : Constructors
|
||
|
~CAccessEntry : Destructor
|
||
|
|
||
|
ResolveSID : Resolve account name to SID
|
||
|
operator == : Comparison operator
|
||
|
AddPermissions : Add to access mask
|
||
|
RemovePermissions : Remove from access mask
|
||
|
MarkEntryAsNew : Flag object as new
|
||
|
MarkEntryAsClean : Remove dirty flag
|
||
|
QueryUserName : Get the account name
|
||
|
QueryPictureID : Get 0-based bitmap offset for account
|
||
|
GetSid : Get the SID
|
||
|
QueryAccessMask : Get the raw Access granted bits
|
||
|
IsDirty : Determine if item has changed
|
||
|
IsDeleted : Determine if item is flagged for deletion
|
||
|
IsVisible : Determine if item should be shown in listbox
|
||
|
FlagForDeletion : Flag object for deletion or reset that flag
|
||
|
IsSIDResolved : Return TRUE if the SID has already been resolved
|
||
|
HasAppropriateAccess : Compare access bits to see if the objects has
|
||
|
specific permissions
|
||
|
HasSomeAccess : Check to see if object has at least one
|
||
|
permission bit set.
|
||
|
IsDeletable : Determine if object can be deleted
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
public:
|
||
|
//
|
||
|
// Helper function to look up account sid
|
||
|
//
|
||
|
static BOOL LookupAccountSid(
|
||
|
IN CString & str,
|
||
|
OUT int & nPictureID,
|
||
|
OUT PSID pSid,
|
||
|
IN LPCTSTR lpstrSystemName = NULL
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Construction/Destruction
|
||
|
//
|
||
|
public:
|
||
|
CAccessEntry(
|
||
|
IN LPVOID pAce,
|
||
|
IN BOOL fResolveSID = FALSE
|
||
|
);
|
||
|
|
||
|
CAccessEntry(
|
||
|
IN ACCESS_MASK accPermissions,
|
||
|
IN PSID pSid,
|
||
|
IN LPCTSTR lpstrSystemName = NULL,
|
||
|
IN BOOL fResolveSID = FALSE
|
||
|
);
|
||
|
|
||
|
CAccessEntry(
|
||
|
IN PSID pSid,
|
||
|
IN LPCTSTR pszUserName,
|
||
|
IN LPCTSTR pszClassName
|
||
|
);
|
||
|
|
||
|
CAccessEntry(
|
||
|
IN CAccessEntry& ae
|
||
|
);
|
||
|
|
||
|
~CAccessEntry();
|
||
|
|
||
|
//
|
||
|
// Operations
|
||
|
//
|
||
|
public:
|
||
|
//void SetAccessMask(LPACCESS_ENTRY lpAccessEntry);
|
||
|
BOOL ResolveSID();
|
||
|
BOOL operator ==(const CAccessEntry & acc) const;
|
||
|
BOOL operator ==(const PSID pSid) const;
|
||
|
void AddPermissions(ACCESS_MASK accnewPermissions);
|
||
|
void RemovePermissions(ACCESS_MASK accPermissions);
|
||
|
void MarkEntryAsNew();
|
||
|
void MarkEntryAsClean();
|
||
|
void MarkEntryAsChanged();
|
||
|
|
||
|
//
|
||
|
// Access Functions
|
||
|
//
|
||
|
public:
|
||
|
LPCTSTR QueryUserName() const;
|
||
|
|
||
|
//
|
||
|
// The "picture" id is the 0-based index of the
|
||
|
// bitmap that goes with this entry, and which
|
||
|
// is used for display in the listbox.
|
||
|
//
|
||
|
int QueryPictureID() const;
|
||
|
|
||
|
PSID GetSid();
|
||
|
|
||
|
ACCESS_MASK QueryAccessMask() const;
|
||
|
|
||
|
//
|
||
|
// Check to see if this entry has undergone
|
||
|
// any changes since we called it up
|
||
|
//
|
||
|
BOOL IsDirty() const;
|
||
|
|
||
|
BOOL IsDeleted() const;
|
||
|
|
||
|
BOOL IsVisible() const;
|
||
|
|
||
|
void FlagForDeletion(
|
||
|
IN BOOL fDelete = TRUE
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Check to see if we've already looked up the
|
||
|
// name of this SID
|
||
|
//
|
||
|
BOOL IsSIDResolved() const;
|
||
|
|
||
|
//
|
||
|
// Check to see if the add flag has been set for this
|
||
|
// entry.
|
||
|
//
|
||
|
/*
|
||
|
BOOL IsNew() const;
|
||
|
|
||
|
//
|
||
|
// Check to see if the update flag has been set for this
|
||
|
// entry.
|
||
|
//
|
||
|
BOOL IsDifferent() const;
|
||
|
*/
|
||
|
|
||
|
//
|
||
|
// See if the entry has the access mask required.
|
||
|
//
|
||
|
BOOL HasAppropriateAccess(ACCESS_MASK accTargetMask) const;
|
||
|
|
||
|
//
|
||
|
// Check to see if the entry has at least some
|
||
|
// privileges (if it doesn't, it should be deleted)
|
||
|
//
|
||
|
BOOL HasSomeAccess() const;
|
||
|
|
||
|
//
|
||
|
// See if this is a deletable entry
|
||
|
//
|
||
|
BOOL IsDeletable() const;
|
||
|
|
||
|
private:
|
||
|
ACCESS_MASK m_accMask;
|
||
|
CString m_strUserName;
|
||
|
LPTSTR m_lpstrSystemName;
|
||
|
PSID m_pSid;
|
||
|
BOOL m_fDirty;
|
||
|
BOOL m_fSIDResolved;
|
||
|
BOOL m_fDeletable;
|
||
|
BOOL m_fInvisible;
|
||
|
BOOL m_fDeleted;
|
||
|
int m_nPictureID;
|
||
|
int m_fUpdates;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Helper functions
|
||
|
//
|
||
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Convert an oblist of CAccessEntry objects to a blob
|
||
|
//
|
||
|
BOOL COMDLL BuildAclBlob(
|
||
|
IN CObListPlus & oblSID,
|
||
|
OUT CBlob & blob
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Reverse the above. Build an oblist of CAccessEntry lists from
|
||
|
// a blob.
|
||
|
//
|
||
|
DWORD COMDLL BuildAclOblistFromBlob(
|
||
|
IN CBlob & blob,
|
||
|
OUT CObListPlus & oblSID
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Build a blob representing an ACL with the local domain group
|
||
|
//
|
||
|
DWORD COMDLL BuildAdminAclBlob(
|
||
|
OUT CBlob & blob
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
class COMDLL CAccessEntryListBox : public CRMCListBox
|
||
|
/*++
|
||
|
|
||
|
Class Description:
|
||
|
|
||
|
Listbox of access entry objects. Listbox may be
|
||
|
single or multiselect.
|
||
|
|
||
|
Public Interface:
|
||
|
|
||
|
CAccessEntryListBox : Constructor
|
||
|
|
||
|
AddToAccessList : Add to list
|
||
|
FillAccessListBox : Fill listbox
|
||
|
ResolveAccessList : Resolve all SIDS in the container
|
||
|
AddUserPermissions : Add user permissions
|
||
|
GetSelectedItem : Get item if it's the only one selected,
|
||
|
or NULL.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
DECLARE_DYNAMIC(CAccessEntryListBox);
|
||
|
|
||
|
public:
|
||
|
static const nBitmaps; // Number of bitmaps
|
||
|
|
||
|
//
|
||
|
// Constructor
|
||
|
//
|
||
|
public:
|
||
|
CAccessEntryListBox(
|
||
|
IN int nTab = 0
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Interface
|
||
|
//
|
||
|
public:
|
||
|
//
|
||
|
// Return the singly selected item, or NULL
|
||
|
// if 0, or more than one item is selected
|
||
|
//
|
||
|
CAccessEntry * GetSelectedItem(
|
||
|
OUT int * pnSel = NULL
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Return next selected listbox item (doesn't matter
|
||
|
// if the listbox is single select or multi-select)
|
||
|
//
|
||
|
CAccessEntry * GetNextSelectedItem(
|
||
|
IN OUT int * pnStartingIndex
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Get item at selection or NULL
|
||
|
//
|
||
|
CAccessEntry * GetItem(UINT nIndex);
|
||
|
|
||
|
//
|
||
|
// Interface to container
|
||
|
//
|
||
|
public:
|
||
|
BOOL AddToAccessList(
|
||
|
IN CWnd * pWnd,
|
||
|
IN LPCTSTR lpstrServer,
|
||
|
IN CObListPlus & obl
|
||
|
);
|
||
|
|
||
|
void FillAccessListBox(
|
||
|
IN CObListPlus & obl
|
||
|
);
|
||
|
|
||
|
protected:
|
||
|
void ResolveAccessList(
|
||
|
IN CObListPlus &obl
|
||
|
);
|
||
|
|
||
|
BOOL AddUserPermissions(
|
||
|
IN LPCTSTR lpstrServer,
|
||
|
IN CObListPlus &oblSID,
|
||
|
IN CAccessEntry * newUser,
|
||
|
IN ACCESS_MASK accPermissions
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Interface to listbox
|
||
|
//
|
||
|
protected:
|
||
|
int AddItem(CAccessEntry * pItem);
|
||
|
void SetTabs(int nTab);
|
||
|
|
||
|
protected:
|
||
|
virtual void DrawItemEx(CRMCListBoxDrawStruct & s);
|
||
|
|
||
|
private:
|
||
|
int m_nTab;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
class COMDLL CBrowseDomainDlg
|
||
|
/*++
|
||
|
|
||
|
Class Description:
|
||
|
|
||
|
Domain browser dialog
|
||
|
|
||
|
Public Interface:
|
||
|
|
||
|
CBrowseDomainDlg : Construct the dialog
|
||
|
~CBrowseDomainDlg : Destruct the dialog
|
||
|
GetSelectedDomain : Get the full path selected
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
//
|
||
|
// Construction
|
||
|
//
|
||
|
public:
|
||
|
//
|
||
|
// standard constructor
|
||
|
//
|
||
|
CBrowseDomainDlg(
|
||
|
IN CWnd * pParent = NULL,
|
||
|
IN LPCTSTR lpszInitialDomain = NULL
|
||
|
);
|
||
|
|
||
|
~CBrowseDomainDlg();
|
||
|
|
||
|
public:
|
||
|
LPCTSTR GetSelectedDomain(
|
||
|
OUT CString & str
|
||
|
) const;
|
||
|
|
||
|
virtual int DoModal();
|
||
|
|
||
|
protected:
|
||
|
TCHAR m_szBuffer[MAX_PATH+1];
|
||
|
CString m_strTitle;
|
||
|
CString m_strInitialDomain;
|
||
|
BROWSEINFO m_bi;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
class COMDLL CBrowseUserDlg
|
||
|
/*++
|
||
|
|
||
|
Class Description:
|
||
|
|
||
|
User browser dialog class. This is simply a thin wrapper around
|
||
|
the getuser interface
|
||
|
|
||
|
Public Interface:
|
||
|
|
||
|
CBrowseUserDlg : Construct the dialog
|
||
|
DoModal : Show the dialog
|
||
|
GetSelectionCount : Query how many user names/groups were selected
|
||
|
GetSelectedAccounts : Get the string list of account names
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
public:
|
||
|
//
|
||
|
// Constructor
|
||
|
//
|
||
|
CBrowseUserDlg(
|
||
|
IN CWnd * pParentWnd = NULL,
|
||
|
IN LPCTSTR lpszTitle = NULL,
|
||
|
IN LPCTSTR lpszInitialDomain = NULL,
|
||
|
IN BOOL fExpandNames = FALSE,
|
||
|
IN BOOL fSkipInitialDomainInName = TRUE,
|
||
|
IN DWORD dwFlags = USRBROWS_INCL_EVERYONE
|
||
|
| USRBROWS_SHOW_ALL,
|
||
|
IN LPCTSTR lpszHelpFileName = NULL,
|
||
|
IN ULONG ulHelpContext = 0L
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Show the dialog
|
||
|
//
|
||
|
virtual int DoModal();
|
||
|
|
||
|
//
|
||
|
// Get the number of selected accounts
|
||
|
//
|
||
|
int GetSelectionCount() const;
|
||
|
|
||
|
//
|
||
|
// Get the selected accounts list
|
||
|
//
|
||
|
CStringList & GetSelectedAccounts();
|
||
|
|
||
|
private:
|
||
|
USERBROWSER m_ub;
|
||
|
BOOL m_fSkipInitialDomainInName;
|
||
|
CStringList m_strSelectedAccounts;
|
||
|
CString m_strTitle;
|
||
|
CString m_strInitialDomain;
|
||
|
CString m_strHelpFileName;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
class COMDLL CUserAccountDlg : public CDialog
|
||
|
/*++
|
||
|
|
||
|
Class Description:
|
||
|
|
||
|
User account dialog. Present a user account/password and allow
|
||
|
changing, browsing and checking the password
|
||
|
|
||
|
Public Interface:
|
||
|
|
||
|
CUserAccountDlg : Constructor
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
//
|
||
|
// Construction
|
||
|
//
|
||
|
public:
|
||
|
CUserAccountDlg(
|
||
|
IN LPCTSTR lpstrServer,
|
||
|
IN LPCTSTR lpstrUserName,
|
||
|
IN LPCTSTR lpstrPassword,
|
||
|
IN CWnd * pParent = NULL
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Dialog Data
|
||
|
//
|
||
|
public:
|
||
|
//{{AFX_DATA(CUserAccountDlg)
|
||
|
enum { IDD = IDD_USER_ACCOUNT };
|
||
|
CEdit m_edit_UserName;
|
||
|
CEdit m_edit_Password;
|
||
|
CString m_strUserName;
|
||
|
//}}AFX_DATA
|
||
|
|
||
|
CString m_strPassword;
|
||
|
//
|
||
|
// Overrides
|
||
|
//
|
||
|
protected:
|
||
|
// ClassWizard generated virtual function overrides
|
||
|
//{{AFX_VIRTUAL(CUserAccountDlg)
|
||
|
protected:
|
||
|
virtual void DoDataExchange(CDataExchange * pDX);
|
||
|
//}}AFX_VIRTUAL
|
||
|
|
||
|
//
|
||
|
// Implementation
|
||
|
//
|
||
|
protected:
|
||
|
|
||
|
// Generated message map functions
|
||
|
//{{AFX_MSG(CUserAccountDlg)
|
||
|
afx_msg void OnButtonBrowseUsers();
|
||
|
afx_msg void OnButtonCheckPassword();
|
||
|
afx_msg void OnChangeEditUsername();
|
||
|
//}}AFX_MSG
|
||
|
DECLARE_MESSAGE_MAP()
|
||
|
|
||
|
private:
|
||
|
CString m_strServer;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Inline Expansion
|
||
|
//
|
||
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||
|
|
||
|
inline int CAccessEntry::QueryPictureID() const
|
||
|
{
|
||
|
ASSERT(m_fSIDResolved);
|
||
|
return m_nPictureID;
|
||
|
}
|
||
|
|
||
|
inline LPCTSTR CAccessEntry::QueryUserName() const
|
||
|
{
|
||
|
return m_strUserName;
|
||
|
}
|
||
|
|
||
|
inline PSID CAccessEntry::GetSid()
|
||
|
{
|
||
|
return m_pSid;
|
||
|
}
|
||
|
|
||
|
inline ACCESS_MASK CAccessEntry::QueryAccessMask() const
|
||
|
{
|
||
|
return m_accMask;
|
||
|
}
|
||
|
|
||
|
inline BOOL CAccessEntry::IsDirty() const
|
||
|
{
|
||
|
return m_fDirty;
|
||
|
}
|
||
|
|
||
|
inline BOOL CAccessEntry::IsDeleted() const
|
||
|
{
|
||
|
return m_fDeleted;
|
||
|
}
|
||
|
|
||
|
inline BOOL CAccessEntry::IsVisible() const
|
||
|
{
|
||
|
return !m_fInvisible;
|
||
|
}
|
||
|
|
||
|
inline void CAccessEntry::FlagForDeletion(
|
||
|
IN BOOL fDelete
|
||
|
)
|
||
|
{
|
||
|
m_fDirty = TRUE;
|
||
|
m_fDeleted = fDelete;
|
||
|
}
|
||
|
|
||
|
inline BOOL CAccessEntry::IsSIDResolved() const
|
||
|
{
|
||
|
return m_fSIDResolved;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
inline BOOL CAccessEntry::IsNew() const
|
||
|
{
|
||
|
return (m_fUpdates & UPD_ADDED) != 0;
|
||
|
}
|
||
|
|
||
|
inline BOOL CAccessEntry::IsDifferent() const
|
||
|
{
|
||
|
return (m_fUpdates & UPD_CHANGED) != 0;
|
||
|
}
|
||
|
|
||
|
inline void CAccessEntry::SetAccessMask(
|
||
|
IN LPACCESS_ENTRY lpAccessEntry
|
||
|
)
|
||
|
{
|
||
|
m_accMask = lpAccessEntry->AccessRights;
|
||
|
}
|
||
|
|
||
|
*/
|
||
|
|
||
|
inline BOOL CAccessEntry::HasAppropriateAccess(
|
||
|
IN ACCESS_MASK accTargetMask
|
||
|
) const
|
||
|
{
|
||
|
return (m_accMask & accTargetMask) == accTargetMask;
|
||
|
}
|
||
|
|
||
|
inline BOOL CAccessEntry::HasSomeAccess() const
|
||
|
{
|
||
|
return m_accMask;
|
||
|
}
|
||
|
|
||
|
inline BOOL CAccessEntry::IsDeletable() const
|
||
|
{
|
||
|
return m_fDeletable;
|
||
|
}
|
||
|
|
||
|
inline BOOL CAccessEntry::operator ==(
|
||
|
IN const CAccessEntry & acc
|
||
|
) const
|
||
|
{
|
||
|
return ::EqualSid(acc.m_pSid, m_pSid);
|
||
|
}
|
||
|
|
||
|
inline BOOL CAccessEntry::operator ==(
|
||
|
IN const PSID pSid
|
||
|
) const
|
||
|
{
|
||
|
return ::EqualSid(pSid, m_pSid);
|
||
|
}
|
||
|
|
||
|
inline void CAccessEntry::MarkEntryAsNew()
|
||
|
{
|
||
|
m_fDirty = TRUE;
|
||
|
//m_fUpdates |= UPD_ADDED;
|
||
|
}
|
||
|
|
||
|
inline void CAccessEntry::MarkEntryAsClean()
|
||
|
{
|
||
|
m_fDirty = FALSE;
|
||
|
//m_fUpdates = UPD_NONE;
|
||
|
}
|
||
|
|
||
|
inline void CAccessEntry::MarkEntryAsChanged()
|
||
|
{
|
||
|
m_fDirty = TRUE;
|
||
|
//m_fUpdates = UPD_CHANGED;
|
||
|
}
|
||
|
|
||
|
inline CAccessEntryListBox::CAccessEntryListBox (
|
||
|
IN int nTab
|
||
|
)
|
||
|
{
|
||
|
SetTabs(nTab);
|
||
|
}
|
||
|
|
||
|
inline void CAccessEntryListBox::SetTabs(
|
||
|
IN int nTab
|
||
|
)
|
||
|
{
|
||
|
m_nTab = nTab;
|
||
|
}
|
||
|
|
||
|
inline CAccessEntry * CAccessEntryListBox::GetItem(
|
||
|
IN UINT nIndex
|
||
|
)
|
||
|
{
|
||
|
return (CAccessEntry *)GetItemDataPtr(nIndex);
|
||
|
}
|
||
|
|
||
|
inline int CAccessEntryListBox::AddItem(
|
||
|
IN CAccessEntry * pItem
|
||
|
)
|
||
|
{
|
||
|
return AddString ((LPCTSTR)pItem);
|
||
|
}
|
||
|
|
||
|
inline CAccessEntry * CAccessEntryListBox::GetSelectedItem(
|
||
|
OUT int * pnSel
|
||
|
)
|
||
|
{
|
||
|
return (CAccessEntry *)CRMCListBox::GetSelectedListItem(pnSel);
|
||
|
}
|
||
|
|
||
|
inline CAccessEntry * CAccessEntryListBox::GetNextSelectedItem(
|
||
|
IN OUT int * pnStartingIndex
|
||
|
)
|
||
|
{
|
||
|
return (CAccessEntry *)CRMCListBox::GetNextSelectedItem(pnStartingIndex);
|
||
|
}
|
||
|
|
||
|
inline int CBrowseUserDlg::GetSelectionCount() const
|
||
|
{
|
||
|
return (int) m_strSelectedAccounts.GetCount();
|
||
|
}
|
||
|
|
||
|
inline CStringList & CBrowseUserDlg::GetSelectedAccounts()
|
||
|
{
|
||
|
return m_strSelectedAccounts;
|
||
|
}
|
||
|
|
||
|
#endif // _USRBROWS_H
|