347 lines
7.7 KiB
C++
347 lines
7.7 KiB
C++
//+---------------------------------------------------------------------------
|
||
//
|
||
// Microsoft Windows
|
||
// Copyright (C) Microsoft Corporation, 1992 - 1995.
|
||
//
|
||
// File: secutil.cxx
|
||
//
|
||
// Contents: Helper routines for conversion - LDAP specific
|
||
//
|
||
// Functions:
|
||
//
|
||
// History: 09-27-98 by splitting ldap\var2sec.cxx
|
||
// and distributing between ldapc and router - AjayR
|
||
//
|
||
//----------------------------------------------------------------------------
|
||
#include "ldapc.hxx"
|
||
#pragma hdrstop
|
||
|
||
//
|
||
// Definition need as this is not a part of the headers
|
||
//
|
||
extern "C" {
|
||
HRESULT
|
||
ADsEncodeBinaryData (
|
||
PBYTE pbSrcData,
|
||
DWORD dwSrcLen,
|
||
LPWSTR * ppszDestData
|
||
);
|
||
}
|
||
|
||
HRESULT
|
||
ConvertSidToString(
|
||
PSID pSid,
|
||
LPWSTR String
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
|
||
This function generates a printable unicode string representation
|
||
of a SID.
|
||
|
||
The resulting string will take one of two forms. If the
|
||
IdentifierAuthority value is not greater than 2^32, then
|
||
the SID will be in the form:
|
||
|
||
|
||
S-1-281736-12-72-9-110
|
||
^ ^^ ^^ ^ ^^^
|
||
| | | | |
|
||
+-----+--+-+--+---- Decimal
|
||
|
||
|
||
|
||
Otherwise it will take the form:
|
||
|
||
|
||
S-1-0x173495281736-12-72-9-110
|
||
^^^^^^^^^^^^^^ ^^ ^^ ^ ^^^
|
||
Hexidecimal | | | |
|
||
+--+-+--+---- Decimal
|
||
|
||
|
||
Arguments:
|
||
|
||
pSid - opaque pointer that supplies the SID that is to be
|
||
converted to Unicode.
|
||
|
||
Return Value:
|
||
|
||
If the Sid is successfully converted to a Unicode string, a
|
||
pointer to the Unicode string is returned, else NULL is
|
||
returned.
|
||
|
||
--*/
|
||
|
||
{
|
||
WCHAR Buffer[256];
|
||
UCHAR i;
|
||
ULONG Tmp;
|
||
HRESULT hr = S_OK;
|
||
|
||
SID_IDENTIFIER_AUTHORITY *pSidIdentifierAuthority;
|
||
PUCHAR pSidSubAuthorityCount;
|
||
|
||
|
||
if (!IsValidSid( pSid )) {
|
||
*String= L'\0';
|
||
hr = HRESULT_FROM_WIN32(ERROR_INVALID_SID);
|
||
RRETURN(hr);
|
||
}
|
||
|
||
wsprintf(Buffer, L"S-%u-", (USHORT)(((PISID)pSid)->Revision ));
|
||
wcscpy(String, Buffer);
|
||
|
||
pSidIdentifierAuthority = GetSidIdentifierAuthority(pSid);
|
||
|
||
if ( (pSidIdentifierAuthority->Value[0] != 0) ||
|
||
(pSidIdentifierAuthority->Value[1] != 0) ){
|
||
wsprintf(Buffer, L"0x%02hx%02hx%02hx%02hx%02hx%02hx",
|
||
(USHORT)pSidIdentifierAuthority->Value[0],
|
||
(USHORT)pSidIdentifierAuthority->Value[1],
|
||
(USHORT)pSidIdentifierAuthority->Value[2],
|
||
(USHORT)pSidIdentifierAuthority->Value[3],
|
||
(USHORT)pSidIdentifierAuthority->Value[4],
|
||
(USHORT)pSidIdentifierAuthority->Value[5] );
|
||
wcscat(String, Buffer);
|
||
|
||
} else {
|
||
|
||
Tmp = (ULONG)pSidIdentifierAuthority->Value[5] +
|
||
(ULONG)(pSidIdentifierAuthority->Value[4] << 8) +
|
||
(ULONG)(pSidIdentifierAuthority->Value[3] << 16) +
|
||
(ULONG)(pSidIdentifierAuthority->Value[2] << 24);
|
||
wsprintf(Buffer, L"%lu", Tmp);
|
||
wcscat(String, Buffer);
|
||
}
|
||
|
||
pSidSubAuthorityCount = GetSidSubAuthorityCount(pSid);
|
||
|
||
for (i=0;i< *(pSidSubAuthorityCount);i++ ) {
|
||
wsprintf(Buffer, L"-%lu", *(GetSidSubAuthority(pSid, i)));
|
||
wcscat(String, Buffer);
|
||
}
|
||
|
||
RRETURN(S_OK);
|
||
|
||
}
|
||
|
||
|
||
HRESULT
|
||
ConvertU2TrusteeToSid(
|
||
LPWSTR pszServerName,
|
||
CCredentials& Credentials,
|
||
LPWSTR pszTrustee,
|
||
LPBYTE Sid,
|
||
PDWORD pdwSidSize
|
||
)
|
||
{
|
||
PADSLDP pLdapHandle = NULL;
|
||
HRESULT hr = S_OK;
|
||
LPWSTR *SidAttribute = NULL;
|
||
DWORD nCount = 0;
|
||
DWORD dwStatus = 0;
|
||
struct berval **ppBerValue = NULL;
|
||
LPWSTR Attributes[2];
|
||
LDAPMessage *res = NULL;
|
||
LDAPMessage *entry = NULL;
|
||
DWORD dwNumberOfEntries = 0;
|
||
DWORD dwSidLength = 0;
|
||
LPBYTE lpByte = NULL;
|
||
WCHAR szSid[MAX_PATH];
|
||
|
||
Attributes[0] = L"Sid";
|
||
Attributes[1] = NULL;
|
||
|
||
ConvertSidToString( Sid, szSid);
|
||
|
||
dwStatus = LdapOpenObject(
|
||
pszServerName,
|
||
pszTrustee,
|
||
&pLdapHandle,
|
||
Credentials,
|
||
FALSE
|
||
);
|
||
if (dwStatus) {
|
||
hr = HRESULT_FROM_WIN32(dwStatus);
|
||
BAIL_ON_FAILURE(hr);
|
||
}
|
||
|
||
dwStatus = LdapSearchS(
|
||
pLdapHandle,
|
||
pszTrustee,
|
||
LDAP_SCOPE_BASE,
|
||
L"(objectClass=*)",
|
||
Attributes,
|
||
0,
|
||
&res
|
||
);
|
||
|
||
if (dwStatus) {
|
||
hr = HRESULT_FROM_WIN32(dwStatus);
|
||
BAIL_ON_FAILURE(hr);
|
||
}
|
||
|
||
dwNumberOfEntries = LdapCountEntries( pLdapHandle, res );
|
||
|
||
if ( dwNumberOfEntries == 0 )
|
||
RRETURN(S_OK);
|
||
|
||
dwStatus = LdapFirstEntry( pLdapHandle, res, &entry );
|
||
|
||
if (dwStatus) {
|
||
hr = HRESULT_FROM_WIN32(dwStatus);
|
||
BAIL_ON_FAILURE(hr);
|
||
}
|
||
|
||
dwStatus = LdapGetValuesLen(
|
||
pLdapHandle,
|
||
entry,
|
||
L"Sid",
|
||
&ppBerValue,
|
||
(int *)&nCount
|
||
);
|
||
if (dwStatus) {
|
||
hr = HRESULT_FROM_WIN32(dwStatus);
|
||
BAIL_ON_FAILURE(hr);
|
||
}
|
||
|
||
dwSidLength = ((struct berval **)ppBerValue)[0]->bv_len;
|
||
lpByte = (LPBYTE)((struct berval **) ppBerValue)[0]->bv_val;
|
||
|
||
|
||
memcpy( Sid, lpByte, dwSidLength);
|
||
*pdwSidSize = dwSidLength;
|
||
|
||
error:
|
||
|
||
if (res) {
|
||
LdapMsgFree( res );
|
||
}
|
||
|
||
RRETURN(hr);
|
||
}
|
||
|
||
|
||
HRESULT
|
||
ConvertSidToU2Trustee(
|
||
LPWSTR pszServerName,
|
||
CCredentials& Credentials,
|
||
PSID pSid,
|
||
LPWSTR szTrustee
|
||
)
|
||
{
|
||
HRESULT hr = S_OK;
|
||
PUCHAR pSidAuthorityCount = NULL;
|
||
LPWSTR pszQueryString = NULL;
|
||
DWORD dwSidLength = 0;
|
||
LDAPMessage *res = NULL;
|
||
LPWSTR pszDN = NULL;
|
||
LDAPMessage *entry = NULL;
|
||
DWORD dwStatus = 0;
|
||
|
||
DWORD dwNumberOfEntries = 0;
|
||
WCHAR szSearchExp[MAX_PATH];
|
||
|
||
PADSLDP pLdapHandle = NULL;
|
||
|
||
LPWSTR Attributes[] = {L"Sid", NULL};
|
||
WCHAR szSid[MAX_PATH];
|
||
|
||
|
||
ConvertSidToString( pSid, szSid);
|
||
|
||
pSidAuthorityCount = GetSidSubAuthorityCount(pSid);
|
||
|
||
if (!pSidAuthorityCount) {
|
||
RRETURN(E_FAIL);
|
||
}
|
||
|
||
dwSidLength = GetSidLengthRequired(*pSidAuthorityCount);
|
||
|
||
hr = ADsEncodeBinaryData (
|
||
(LPBYTE)pSid,
|
||
dwSidLength,
|
||
&pszQueryString
|
||
);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
|
||
dwStatus = LdapOpenObject(
|
||
pszServerName,
|
||
NULL,
|
||
&pLdapHandle,
|
||
Credentials,
|
||
FALSE
|
||
);
|
||
if (dwStatus) {
|
||
hr = HRESULT_FROM_WIN32(dwStatus);
|
||
BAIL_ON_FAILURE(hr);
|
||
}
|
||
|
||
wcscpy(szSearchExp,L"(Sid=");
|
||
wcscat(szSearchExp, pszQueryString);
|
||
wcscat(szSearchExp, L")");
|
||
|
||
dwStatus = LdapSearchS(
|
||
pLdapHandle,
|
||
NULL,
|
||
LDAP_SCOPE_SUBTREE,
|
||
szSearchExp,
|
||
Attributes,
|
||
0,
|
||
&res
|
||
);
|
||
|
||
if (dwStatus) {
|
||
hr = HRESULT_FROM_WIN32(dwStatus);
|
||
BAIL_ON_FAILURE(hr);
|
||
}
|
||
|
||
dwNumberOfEntries = LdapCountEntries( pLdapHandle, res );
|
||
|
||
if ( dwNumberOfEntries == 0 ){
|
||
hr = E_FAIL;
|
||
BAIL_ON_FAILURE(hr);
|
||
}
|
||
|
||
dwStatus = LdapFirstEntry( pLdapHandle, res, &entry );
|
||
|
||
if (dwStatus) {
|
||
hr = HRESULT_FROM_WIN32(dwStatus);
|
||
BAIL_ON_FAILURE(hr);
|
||
}
|
||
|
||
dwStatus = LdapGetDn( pLdapHandle, entry, &pszDN);
|
||
if (dwStatus) {
|
||
hr = HRESULT_FROM_WIN32(dwStatus);
|
||
BAIL_ON_FAILURE(hr);
|
||
}
|
||
|
||
wcscpy(szTrustee, pszDN);
|
||
|
||
error:
|
||
|
||
if (pszQueryString) {
|
||
FreeADsStr(pszQueryString);
|
||
}
|
||
|
||
if (pszDN) {
|
||
LdapMemFree(pszDN);
|
||
}
|
||
|
||
if (res) {
|
||
LdapMsgFree( res );
|
||
}
|
||
|
||
if (pLdapHandle) {
|
||
LdapCloseObject( pLdapHandle);
|
||
}
|
||
|
||
RRETURN(hr);
|
||
}
|
||
|
||
|