|
|
//+------------------------------------------------------------------
//
// Copyright (C) 1995, Microsoft Corporation.
//
// File: account.cxx
//
// Contents: Class wrapping account sid and name
//
// Classes: CAccount
//
// History: Nov-93 DaveMont Created.
//
//-------------------------------------------------------------------
#include <account.hxx>
//+---------------------------------------------------------------------------
//
// Member: CAccount::CAccount, public
//
// Synopsis: initializes data members
//
// Arguments: IN [Name] - principal
// IN [System] - server/domain
//
//----------------------------------------------------------------------------
CAccount::CAccount(WCHAR *Name, WCHAR *System) : _name(Name), _system(System), _domain(NULL), _psid(NULL), _fsid(TRUE) { } //+---------------------------------------------------------------------------
//
// Member: CAccount::CAccount, public
//
// Synopsis: Initializes data members
//
// Arguments: IN [pSid] - SID of principal
// IN [System] - server/domain
//
//----------------------------------------------------------------------------
CAccount::CAccount(SID *pSid, WCHAR *System) : _name(NULL), _system(System), _domain(NULL), _psid(pSid), _fsid(FALSE) { } //+---------------------------------------------------------------------------
//
// Member: Dtor, public
//
// Synopsis: frees sid or name and domain
//
// Arguments: none
//
//----------------------------------------------------------------------------
CAccount::~CAccount() { if (_fsid) { if (_psid) { LocalFree(_psid); } } else if (_name) { LocalFree(_name); } if (_domain) LocalFree(_domain); } //+---------------------------------------------------------------------------
//
// Member: CAccount::GetAccountName, public
//
// Synopsis: returns the Name associated with the instance of the class
//
// Arguments: OUT [name] address of the principal name
//
//----------------------------------------------------------------------------
ULONG CAccount::GetAccountName(WCHAR **name) {
ULONG ret = ERROR_SUCCESS;
if (_name == NULL) { DWORD can = 0, crd = 0; SID_NAME_USE esnu;
if (!LookupAccountSid( NULL, _psid, NULL, &can, NULL, &crd, &esnu)) { if (ERROR_INSUFFICIENT_BUFFER == (ret = GetLastError())) { ret = ERROR_SUCCESS; if (NULL == (_name = (WCHAR *)LocalAlloc(LMEM_FIXED, can * sizeof(WCHAR)))) { return(ERROR_NOT_ENOUGH_MEMORY); } if (NULL == (_domain = (WCHAR *)LocalAlloc(LMEM_FIXED, crd * sizeof(WCHAR)))) { return(ERROR_NOT_ENOUGH_MEMORY); }
if ( !LookupAccountSid( NULL, _psid, _name, &can, _domain, &crd, &esnu) ) { ret = GetLastError(); } } } } *name = _name; return(ret); } //+---------------------------------------------------------------------------
//
// Member: CAccount::GetAccountSid, public
//
// Synopsis: returns the Sid
//
// Arguments: OUT [psid] - sid associated with instance of the class
//
//----------------------------------------------------------------------------
ULONG CAccount::GetAccountSid(SID **psid) {
ULONG ret = ERROR_SUCCESS;
if (_psid == NULL && _name != NULL) { DWORD cusid = 0, crd = 0; SID_NAME_USE esnu;
if (!LookupAccountName( _system, _name, NULL, &cusid, NULL, &crd, &esnu)) { if (ERROR_INSUFFICIENT_BUFFER == (ret = GetLastError())) {
ret = ERROR_SUCCESS; if (NULL == (_psid = (SID *)LocalAlloc(LMEM_FIXED, cusid))) { return(ERROR_NOT_ENOUGH_MEMORY); } if (NULL == (_domain = (WCHAR *)LocalAlloc(LMEM_FIXED, crd * sizeof(WCHAR)))) { return(ERROR_NOT_ENOUGH_MEMORY); }
if ( !LookupAccountName( _system, _name, _psid, &cusid, _domain, &crd, &esnu) )
{ ret = GetLastError(); } } } } *psid = _psid; return(ret); } //+---------------------------------------------------------------------------
//
// Member: CAccount::GetAccountDomain, public
//
// Synopsis: returns the domain for the class
//
// Arguments: [domain] - returns the domain associated with the instance of
// the class
//
//----------------------------------------------------------------------------
ULONG CAccount::GetAccountDomain(WCHAR **domain) { ULONG ret = ERROR_SUCCESS;
if (_domain == NULL) { if (_fsid) { SID *psid; ret = GetAccountSid(&psid); } else { WCHAR *name; ret = GetAccountName(&name); } } *domain = _domain; return(ret); }
|