LookupAccountSid() helper added
This commit is contained in:
parent
a4a0d7cd55
commit
0507e4c5e8
@ -58,6 +58,9 @@ inline VOID OutputDebugStr(_In_ LPCSTR lpOutputString, ...);
|
|||||||
inline VOID OutputDebugStr(_In_ LPCWSTR lpOutputString, ...);
|
inline VOID OutputDebugStr(_In_ LPCWSTR lpOutputString, ...);
|
||||||
template<class _Elem, class _Traits, class _Ax> inline int GetDateFormatA(_In_ LCID Locale, _In_ DWORD dwFlags, _In_opt_ const SYSTEMTIME *lpDate, _In_opt_ LPCSTR lpFormat, _Out_ std::basic_string<_Elem, _Traits, _Ax> &sDate);
|
template<class _Elem, class _Traits, class _Ax> inline int GetDateFormatA(_In_ LCID Locale, _In_ DWORD dwFlags, _In_opt_ const SYSTEMTIME *lpDate, _In_opt_ LPCSTR lpFormat, _Out_ std::basic_string<_Elem, _Traits, _Ax> &sDate);
|
||||||
template<class _Elem, class _Traits, class _Ax> inline int GetDateFormatW(_In_ LCID Locale, _In_ DWORD dwFlags, _In_opt_ const SYSTEMTIME *lpDate, _In_opt_ LPCWSTR lpFormat, _Out_ std::basic_string<_Elem, _Traits, _Ax> &sDate);
|
template<class _Elem, class _Traits, class _Ax> inline int GetDateFormatW(_In_ LCID Locale, _In_ DWORD dwFlags, _In_opt_ const SYSTEMTIME *lpDate, _In_opt_ LPCWSTR lpFormat, _Out_ std::basic_string<_Elem, _Traits, _Ax> &sDate);
|
||||||
|
template<class _Elem, class _Traits, class _Ax> inline BOOL LookupAccountSidA(_In_opt_ LPCSTR lpSystemName, _In_ PSID lpSid, _Out_opt_ std::basic_string<_Elem, _Traits, _Ax> *sName, _Out_opt_ std::basic_string<_Elem, _Traits, _Ax> *sReferencedDomainName, _Out_ PSID_NAME_USE peUse);
|
||||||
|
template<class _Elem, class _Traits, class _Ax> inline BOOL LookupAccountSidW(_In_opt_ LPCWSTR lpSystemName, _In_ PSID lpSid, _Out_opt_ std::basic_string<_Elem, _Traits, _Ax> *sName, _Out_opt_ std::basic_string<_Elem, _Traits, _Ax> *sReferencedDomainName, _Out_ PSID_NAME_USE peUse);
|
||||||
|
|
||||||
|
|
||||||
namespace winstd
|
namespace winstd
|
||||||
{
|
{
|
||||||
@ -792,6 +795,86 @@ template<class _Elem, class _Traits, class _Ax> inline int GetDateFormatW(_In_ L
|
|||||||
return iResult;
|
return iResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Retrieves the name of the account for this SID and the name of the first domain on which this SID is found.
|
||||||
|
///
|
||||||
|
/// \sa [LookupAccountSid function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa379166.aspx)
|
||||||
|
///
|
||||||
|
template<class _Elem, class _Traits, class _Ax>
|
||||||
|
inline BOOL LookupAccountSidA(_In_opt_ LPCSTR lpSystemName, _In_ PSID lpSid, _Out_opt_ std::basic_string<_Elem, _Traits, _Ax> *sName, _Out_opt_ std::basic_string<_Elem, _Traits, _Ax> *sReferencedDomainName, _Out_ PSID_NAME_USE peUse)
|
||||||
|
{
|
||||||
|
assert(0); // TODO: Test this code.
|
||||||
|
|
||||||
|
DWORD dwNameLen = 0, dwRefDomainLen = 0;
|
||||||
|
|
||||||
|
if (LookupAccountSidA(lpSystemName, lpSid,
|
||||||
|
NULL, sName ? &dwNameLen : NULL,
|
||||||
|
NULL, sReferencedDomainName ? &dwRefDomainLen : NULL,
|
||||||
|
peUse))
|
||||||
|
{
|
||||||
|
// Name and domain is blank.
|
||||||
|
if (sName ) sName ->clear();
|
||||||
|
if (sReferencedDomainName) sReferencedDomainName->clear();
|
||||||
|
return TRUE;
|
||||||
|
} else if (GetLastError() == ERROR_MORE_DATA) {
|
||||||
|
// Allocate on heap and retry.
|
||||||
|
std::unique_ptr<_Elem[]> bufName (new _Elem[dwNameLen ]);
|
||||||
|
std::unique_ptr<_Elem[]> bufRefDomain(new _Elem[dwRefDomainLen]);
|
||||||
|
if (LookupAccountSidA(lpSystemName, lpSid,
|
||||||
|
bufName .get(), sName ? &dwNameLen : NULL,
|
||||||
|
bufRefDomain.get(), sReferencedDomainName ? &dwRefDomainLen : NULL,
|
||||||
|
peUse))
|
||||||
|
{
|
||||||
|
if (sName ) sName ->assign(bufName .get(), dwNameLen - 1);
|
||||||
|
if (sReferencedDomainName) sReferencedDomainName->assign(bufRefDomain.get(), dwRefDomainLen - 1);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Retrieves the name of the account for this SID and the name of the first domain on which this SID is found.
|
||||||
|
///
|
||||||
|
/// \sa [LookupAccountSid function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa379166.aspx)
|
||||||
|
///
|
||||||
|
template<class _Elem, class _Traits, class _Ax>
|
||||||
|
inline BOOL LookupAccountSidW(_In_opt_ LPCWSTR lpSystemName, _In_ PSID lpSid, _Out_opt_ std::basic_string<_Elem, _Traits, _Ax> *sName, _Out_opt_ std::basic_string<_Elem, _Traits, _Ax> *sReferencedDomainName, _Out_ PSID_NAME_USE peUse)
|
||||||
|
{
|
||||||
|
assert(0); // TODO: Test this code.
|
||||||
|
|
||||||
|
DWORD dwNameLen = 0, dwRefDomainLen = 0;
|
||||||
|
|
||||||
|
if (LookupAccountSidW(lpSystemName, lpSid,
|
||||||
|
NULL, sName ? &dwNameLen : NULL,
|
||||||
|
NULL, sReferencedDomainName ? &dwRefDomainLen : NULL,
|
||||||
|
peUse))
|
||||||
|
{
|
||||||
|
// Name and domain is blank.
|
||||||
|
if (sName ) sName ->clear();
|
||||||
|
if (sReferencedDomainName) sReferencedDomainName->clear();
|
||||||
|
return TRUE;
|
||||||
|
} else if (GetLastError() == ERROR_MORE_DATA) {
|
||||||
|
// Allocate on heap and retry.
|
||||||
|
std::unique_ptr<_Elem[]> bufName (new _Elem[dwNameLen ]);
|
||||||
|
std::unique_ptr<_Elem[]> bufRefDomain(new _Elem[dwRefDomainLen]);
|
||||||
|
if (LookupAccountSidW(lpSystemName, lpSid,
|
||||||
|
bufName .get(), sName ? &dwNameLen : NULL,
|
||||||
|
bufRefDomain.get(), sReferencedDomainName ? &dwRefDomainLen : NULL,
|
||||||
|
peUse))
|
||||||
|
{
|
||||||
|
if (sName ) sName ->assign(bufName .get(), dwNameLen - 1);
|
||||||
|
if (sReferencedDomainName) sReferencedDomainName->assign(bufRefDomain.get(), dwRefDomainLen - 1);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user