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);
|
|||
|
}
|
|||
|
|
|||
|
|