mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 13:45:50 +00:00
[USERENV]
Get the user name and domain name from the logon token and set the USERNAME and USERDOMAIN environment variables accordingly. svn path=/trunk/; revision=60834
This commit is contained in:
parent
755334ff27
commit
10e3457aad
4 changed files with 201 additions and 32 deletions
|
@ -175,8 +175,8 @@ GetCurrentUserKey(HANDLE hToken)
|
||||||
HKEY hKey;
|
HKEY hKey;
|
||||||
LONG Error;
|
LONG Error;
|
||||||
|
|
||||||
if (!GetUserSidFromToken(hToken,
|
if (!GetUserSidStringFromToken(hToken,
|
||||||
&SidString))
|
&SidString))
|
||||||
{
|
{
|
||||||
DPRINT1("GetUserSidFromToken() failed\n");
|
DPRINT1("GetUserSidFromToken() failed\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -201,6 +201,89 @@ GetCurrentUserKey(HANDLE hToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
BOOL
|
||||||
|
GetUserAndDomainName(IN HANDLE hToken,
|
||||||
|
OUT LPWSTR *UserName,
|
||||||
|
OUT LPWSTR *DomainName)
|
||||||
|
{
|
||||||
|
PSID Sid = NULL;
|
||||||
|
LPWSTR lpUserName = NULL;
|
||||||
|
LPWSTR lpDomainName = NULL;
|
||||||
|
DWORD cbUserName = 0;
|
||||||
|
DWORD cbDomainName = 0;
|
||||||
|
SID_NAME_USE SidNameUse;
|
||||||
|
BOOL bRet = TRUE;
|
||||||
|
|
||||||
|
if (!GetUserSidFromToken(hToken,
|
||||||
|
&Sid))
|
||||||
|
{
|
||||||
|
DPRINT1("GetUserSidFromToken() failed\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!LookupAccountSidW(NULL,
|
||||||
|
Sid,
|
||||||
|
NULL,
|
||||||
|
&cbUserName,
|
||||||
|
NULL,
|
||||||
|
&cbDomainName,
|
||||||
|
&SidNameUse))
|
||||||
|
{
|
||||||
|
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
|
||||||
|
{
|
||||||
|
bRet = FALSE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lpUserName = LocalAlloc(LPTR,
|
||||||
|
cbUserName * sizeof(WCHAR));
|
||||||
|
if (lpUserName == NULL)
|
||||||
|
{
|
||||||
|
bRet = FALSE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
lpDomainName = LocalAlloc(LPTR,
|
||||||
|
cbDomainName * sizeof(WCHAR));
|
||||||
|
if (lpDomainName == NULL)
|
||||||
|
{
|
||||||
|
bRet = FALSE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!LookupAccountSidW(NULL,
|
||||||
|
Sid,
|
||||||
|
lpUserName,
|
||||||
|
&cbUserName,
|
||||||
|
lpDomainName,
|
||||||
|
&cbDomainName,
|
||||||
|
&SidNameUse))
|
||||||
|
{
|
||||||
|
bRet = FALSE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
*UserName = lpUserName;
|
||||||
|
*DomainName = lpDomainName;
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (bRet == FALSE)
|
||||||
|
{
|
||||||
|
if (lpUserName != NULL)
|
||||||
|
LocalFree(lpUserName);
|
||||||
|
|
||||||
|
if (lpDomainName != NULL)
|
||||||
|
LocalFree(lpDomainName);
|
||||||
|
}
|
||||||
|
|
||||||
|
LocalFree(Sid);
|
||||||
|
|
||||||
|
return bRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
BOOL
|
BOOL
|
||||||
SetUserEnvironment(LPVOID *lpEnvironment,
|
SetUserEnvironment(LPVOID *lpEnvironment,
|
||||||
|
@ -326,6 +409,8 @@ CreateEnvironmentBlock(LPVOID *lpEnvironment,
|
||||||
DWORD dwType;
|
DWORD dwType;
|
||||||
HKEY hKey;
|
HKEY hKey;
|
||||||
HKEY hKeyUser;
|
HKEY hKeyUser;
|
||||||
|
LPWSTR lpUserName = NULL;
|
||||||
|
LPWSTR lpDomainName = NULL;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
LONG lError;
|
LONG lError;
|
||||||
|
|
||||||
|
@ -431,15 +516,20 @@ CreateEnvironmentBlock(LPVOID *lpEnvironment,
|
||||||
FALSE);
|
FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: Set 'USERDOMAIN' variable */
|
if (GetUserAndDomainName(hToken,
|
||||||
|
&lpUserName,
|
||||||
Length = MAX_PATH;
|
&lpDomainName))
|
||||||
if (GetUserNameW(Buffer,
|
|
||||||
&Length))
|
|
||||||
{
|
{
|
||||||
|
/* Set 'USERDOMAIN' variable */
|
||||||
|
SetUserEnvironmentVariable(lpEnvironment,
|
||||||
|
L"USERDOMAIN",
|
||||||
|
lpDomainName,
|
||||||
|
FALSE);
|
||||||
|
|
||||||
|
/* Set 'USERNAME' variable */
|
||||||
SetUserEnvironmentVariable(lpEnvironment,
|
SetUserEnvironmentVariable(lpEnvironment,
|
||||||
L"USERNAME",
|
L"USERNAME",
|
||||||
Buffer,
|
lpUserName,
|
||||||
FALSE);
|
FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,6 +545,12 @@ CreateEnvironmentBlock(LPVOID *lpEnvironment,
|
||||||
|
|
||||||
RegCloseKey(hKeyUser);
|
RegCloseKey(hKeyUser);
|
||||||
|
|
||||||
|
if (lpUserName != NULL)
|
||||||
|
LocalFree(lpUserName);
|
||||||
|
|
||||||
|
if (lpDomainName != NULL)
|
||||||
|
LocalFree(lpDomainName);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,11 @@ AppendBackslash(LPWSTR String);
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
GetUserSidFromToken(HANDLE hToken,
|
GetUserSidFromToken(HANDLE hToken,
|
||||||
PUNICODE_STRING SidString);
|
PSID *Sid);
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
GetUserSidStringFromToken(HANDLE hToken,
|
||||||
|
PUNICODE_STRING SidString);
|
||||||
|
|
||||||
PSECURITY_DESCRIPTOR
|
PSECURITY_DESCRIPTOR
|
||||||
CreateDefaultSecurityDescriptor(VOID);
|
CreateDefaultSecurityDescriptor(VOID);
|
||||||
|
|
|
@ -53,56 +53,124 @@ AppendBackslash(LPWSTR String)
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
GetUserSidFromToken(HANDLE hToken,
|
GetUserSidFromToken(HANDLE hToken,
|
||||||
PUNICODE_STRING SidString)
|
PSID *Sid)
|
||||||
{
|
{
|
||||||
PSID_AND_ATTRIBUTES SidBuffer, nsb;
|
PTOKEN_USER UserBuffer, nsb;
|
||||||
|
PSID pSid = NULL;
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
Length = 256;
|
Length = 256;
|
||||||
SidBuffer = LocalAlloc(LMEM_FIXED,
|
UserBuffer = LocalAlloc(LPTR, Length);
|
||||||
Length);
|
if (UserBuffer == NULL)
|
||||||
if (SidBuffer == NULL)
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
Status = NtQueryInformationToken(hToken,
|
Status = NtQueryInformationToken(hToken,
|
||||||
TokenUser,
|
TokenUser,
|
||||||
(PVOID)SidBuffer,
|
(PVOID)UserBuffer,
|
||||||
Length,
|
Length,
|
||||||
&Length);
|
&Length);
|
||||||
if (Status == STATUS_BUFFER_TOO_SMALL)
|
if (Status == STATUS_BUFFER_TOO_SMALL)
|
||||||
{
|
{
|
||||||
nsb = LocalReAlloc(SidBuffer,
|
nsb = LocalReAlloc(UserBuffer, Length, LMEM_MOVEABLE);
|
||||||
Length,
|
|
||||||
LMEM_MOVEABLE);
|
|
||||||
if (nsb == NULL)
|
if (nsb == NULL)
|
||||||
{
|
{
|
||||||
LocalFree((HLOCAL)SidBuffer);
|
LocalFree(UserBuffer);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
SidBuffer = nsb;
|
UserBuffer = nsb;
|
||||||
Status = NtQueryInformationToken(hToken,
|
Status = NtQueryInformationToken(hToken,
|
||||||
TokenUser,
|
TokenUser,
|
||||||
(PVOID)SidBuffer,
|
(PVOID)UserBuffer,
|
||||||
Length,
|
Length,
|
||||||
&Length);
|
&Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!NT_SUCCESS (Status))
|
if (!NT_SUCCESS (Status))
|
||||||
{
|
{
|
||||||
LocalFree((HLOCAL)SidBuffer);
|
LocalFree(UserBuffer);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Length = RtlLengthSid(UserBuffer->User.Sid);
|
||||||
|
|
||||||
|
pSid = LocalAlloc(LPTR, Length);
|
||||||
|
if (pSid == NULL)
|
||||||
|
{
|
||||||
|
LocalFree(UserBuffer);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = RtlCopySid(Length, pSid, UserBuffer->User.Sid);
|
||||||
|
|
||||||
|
LocalFree(UserBuffer);
|
||||||
|
|
||||||
|
if (!NT_SUCCESS (Status))
|
||||||
|
{
|
||||||
|
LocalFree(pSid);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*Sid = pSid;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
GetUserSidStringFromToken(HANDLE hToken,
|
||||||
|
PUNICODE_STRING SidString)
|
||||||
|
{
|
||||||
|
PTOKEN_USER UserBuffer, nsb;
|
||||||
|
ULONG Length;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
Length = 256;
|
||||||
|
UserBuffer = LocalAlloc(LPTR, Length);
|
||||||
|
if (UserBuffer == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
Status = NtQueryInformationToken(hToken,
|
||||||
|
TokenUser,
|
||||||
|
(PVOID)UserBuffer,
|
||||||
|
Length,
|
||||||
|
&Length);
|
||||||
|
if (Status == STATUS_BUFFER_TOO_SMALL)
|
||||||
|
{
|
||||||
|
nsb = LocalReAlloc(UserBuffer,
|
||||||
|
Length,
|
||||||
|
LMEM_MOVEABLE);
|
||||||
|
if (nsb == NULL)
|
||||||
|
{
|
||||||
|
LocalFree(UserBuffer);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
UserBuffer = nsb;
|
||||||
|
Status = NtQueryInformationToken(hToken,
|
||||||
|
TokenUser,
|
||||||
|
(PVOID)UserBuffer,
|
||||||
|
Length,
|
||||||
|
&Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!NT_SUCCESS (Status))
|
||||||
|
{
|
||||||
|
LocalFree(UserBuffer);
|
||||||
SetLastError(RtlNtStatusToDosError(Status));
|
SetLastError(RtlNtStatusToDosError(Status));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINT("SidLength: %lu\n", RtlLengthSid (SidBuffer[0].Sid));
|
DPRINT("SidLength: %lu\n", RtlLengthSid (UserBuffer->User.Sid));
|
||||||
|
|
||||||
Status = RtlConvertSidToUnicodeString(SidString,
|
Status = RtlConvertSidToUnicodeString(SidString,
|
||||||
SidBuffer[0].Sid,
|
UserBuffer->User.Sid,
|
||||||
TRUE);
|
TRUE);
|
||||||
|
|
||||||
LocalFree((HLOCAL)SidBuffer);
|
LocalFree(UserBuffer);
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
@ -117,6 +185,7 @@ GetUserSidFromToken(HANDLE hToken,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PSECURITY_DESCRIPTOR
|
PSECURITY_DESCRIPTOR
|
||||||
CreateDefaultSecurityDescriptor(VOID)
|
CreateDefaultSecurityDescriptor(VOID)
|
||||||
{
|
{
|
||||||
|
|
|
@ -814,8 +814,8 @@ GetUserProfileDirectoryW(HANDLE hToken,
|
||||||
HKEY hKey;
|
HKEY hKey;
|
||||||
LONG Error;
|
LONG Error;
|
||||||
|
|
||||||
if (!GetUserSidFromToken(hToken,
|
if (!GetUserSidStringFromToken(hToken,
|
||||||
&SidString))
|
&SidString))
|
||||||
{
|
{
|
||||||
DPRINT1("GetUserSidFromToken() failed\n");
|
DPRINT1("GetUserSidFromToken() failed\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -898,8 +898,8 @@ CheckForLoadedProfile(HANDLE hToken)
|
||||||
|
|
||||||
DPRINT("CheckForLoadedProfile() called\n");
|
DPRINT("CheckForLoadedProfile() called\n");
|
||||||
|
|
||||||
if (!GetUserSidFromToken(hToken,
|
if (!GetUserSidStringFromToken(hToken,
|
||||||
&SidString))
|
&SidString))
|
||||||
{
|
{
|
||||||
DPRINT1("GetUserSidFromToken() failed\n");
|
DPRINT1("GetUserSidFromToken() failed\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1166,7 +1166,7 @@ LoadUserProfileW(IN HANDLE hToken,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get user SID string */
|
/* Get user SID string */
|
||||||
ret = GetUserSidFromToken(hToken, &SidString);
|
ret = GetUserSidStringFromToken(hToken, &SidString);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
{
|
{
|
||||||
DPRINT1("GetUserSidFromToken() failed\n");
|
DPRINT1("GetUserSidFromToken() failed\n");
|
||||||
|
@ -1243,8 +1243,8 @@ UnloadUserProfile(HANDLE hToken,
|
||||||
|
|
||||||
RegCloseKey(hProfile);
|
RegCloseKey(hProfile);
|
||||||
|
|
||||||
if (!GetUserSidFromToken(hToken,
|
if (!GetUserSidStringFromToken(hToken,
|
||||||
&SidString))
|
&SidString))
|
||||||
{
|
{
|
||||||
DPRINT1("GetUserSidFromToken() failed\n");
|
DPRINT1("GetUserSidFromToken() failed\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue