Translates a delimited list of string sids to user names
Syntax
HRESULT WINAPI SHResolveUserNames (
LPCWSTR pwszSids,
LPWSTR pwszNames,
UINT nameLen
)
Parameters
- pwszSids
- A list of string sids in the format of '<compName>:<sid>' delimited by semi-colons. <compname> must be the same for every entry in the list
- pwszNames
- Pointer to a buffer to store the translated names
- nameLen
- Length of the pwszNames buffer in characters
Return Value
S_OK on success or a standard COM error code or HRESULT_FROM_WIN32(GetLastError()) on failure
Remarks
The names returned in pwszNames are delimited by semi-colons.
No trailing semi-colon is allowed at the end of the pwszSids and the '<compname>' portion will be truncated to 15 characters if it is any longer than that.
CoInitialize(NULL)/CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) must be called before this function.
This function is also known as _SHResolveUserNames@12.
Example
#define _WIN32_DCOM
#include <windows.h>
#include <objbase.h>
#include <stdio.h>
typedef HRESULT (WINAPI*pfnResolve)(LPCWSTR, LPWSTR, UINT);
int main()
{
HRESULT hr = S_OK;
HMODULE hShell = LoadLibraryW(L"shell32.dll");
pfnResolve shResolveUserNames = (pfnResolve)GetProcAddress(hShell, (LPCSTR)270);
/* 'Laptop' is my computer name */
LPCWSTR pwszSids = L"Laptop:S-1-1-0;Laptop:S-1-2-1;Laptop:S-1-5-11";
WCHAR wszNameBuffer[500] = {0};
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
hr = shResolveUserNames(pwszSids, wszNameBuffer, ARRAYSIZE(wszNameBuffer));
if(SUCCEEDED(hr))
{
LPCWSTR pwszNameBuffer = wszNameBuffer;
LPCWSTR pwszSidsIter = pwszSids;
LPCWSTR pwszNameBufferIter = wszNameBuffer;
while(pwszSidsIter && pwszSids)
{
pwszSidsIter = wcschr(pwszSids, L';');
pwszNameBufferIter = wcschr(pwszNameBuffer, L';');
if(pwszSidsIter && pwszNameBufferIter)
{
wprintf(
L"%.*s = %.*s\n",
pwszSidsIter - pwszSids,
pwszSids,
pwszNameBufferIter - pwszNameBuffer,
pwszNameBuffer
);
++pwszSidsIter; ++pwszNameBufferIter;
}
else
{
wprintf(L"%s = %s\n", pwszSids, pwszNameBuffer);;
}
pwszSids = pwszSidsIter;
pwszNameBuffer = pwszNameBufferIter;
}
}
FreeLibrary(hShell);
CoUninitialize();
return 0;
}
OUTPUT ------ Laptop:S-1-1-0 = Everyone Laptop:S-1-2-1 = CONSOLE LOGON Laptop:S-1-5-11 = Authenticated Users/* */