mirror of
https://github.com/reactos/reactos.git
synced 2024-06-26 07:51:52 +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
|
@ -175,8 +175,8 @@ GetCurrentUserKey(HANDLE hToken)
|
|||
HKEY hKey;
|
||||
LONG Error;
|
||||
|
||||
if (!GetUserSidFromToken(hToken,
|
||||
&SidString))
|
||||
if (!GetUserSidStringFromToken(hToken,
|
||||
&SidString))
|
||||
{
|
||||
DPRINT1("GetUserSidFromToken() failed\n");
|
||||
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
|
||||
BOOL
|
||||
SetUserEnvironment(LPVOID *lpEnvironment,
|
||||
|
@ -326,6 +409,8 @@ CreateEnvironmentBlock(LPVOID *lpEnvironment,
|
|||
DWORD dwType;
|
||||
HKEY hKey;
|
||||
HKEY hKeyUser;
|
||||
LPWSTR lpUserName = NULL;
|
||||
LPWSTR lpDomainName = NULL;
|
||||
NTSTATUS Status;
|
||||
LONG lError;
|
||||
|
||||
|
@ -431,15 +516,20 @@ CreateEnvironmentBlock(LPVOID *lpEnvironment,
|
|||
FALSE);
|
||||
}
|
||||
|
||||
/* FIXME: Set 'USERDOMAIN' variable */
|
||||
|
||||
Length = MAX_PATH;
|
||||
if (GetUserNameW(Buffer,
|
||||
&Length))
|
||||
if (GetUserAndDomainName(hToken,
|
||||
&lpUserName,
|
||||
&lpDomainName))
|
||||
{
|
||||
/* Set 'USERDOMAIN' variable */
|
||||
SetUserEnvironmentVariable(lpEnvironment,
|
||||
L"USERDOMAIN",
|
||||
lpDomainName,
|
||||
FALSE);
|
||||
|
||||
/* Set 'USERNAME' variable */
|
||||
SetUserEnvironmentVariable(lpEnvironment,
|
||||
L"USERNAME",
|
||||
Buffer,
|
||||
lpUserName,
|
||||
FALSE);
|
||||
}
|
||||
|
||||
|
@ -455,6 +545,12 @@ CreateEnvironmentBlock(LPVOID *lpEnvironment,
|
|||
|
||||
RegCloseKey(hKeyUser);
|
||||
|
||||
if (lpUserName != NULL)
|
||||
LocalFree(lpUserName);
|
||||
|
||||
if (lpDomainName != NULL)
|
||||
LocalFree(lpDomainName);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -75,7 +75,11 @@ AppendBackslash(LPWSTR String);
|
|||
|
||||
BOOL
|
||||
GetUserSidFromToken(HANDLE hToken,
|
||||
PUNICODE_STRING SidString);
|
||||
PSID *Sid);
|
||||
|
||||
BOOL
|
||||
GetUserSidStringFromToken(HANDLE hToken,
|
||||
PUNICODE_STRING SidString);
|
||||
|
||||
PSECURITY_DESCRIPTOR
|
||||
CreateDefaultSecurityDescriptor(VOID);
|
||||
|
|
|
@ -53,56 +53,124 @@ AppendBackslash(LPWSTR String)
|
|||
|
||||
BOOL
|
||||
GetUserSidFromToken(HANDLE hToken,
|
||||
PUNICODE_STRING SidString)
|
||||
PSID *Sid)
|
||||
{
|
||||
PSID_AND_ATTRIBUTES SidBuffer, nsb;
|
||||
PTOKEN_USER UserBuffer, nsb;
|
||||
PSID pSid = NULL;
|
||||
ULONG Length;
|
||||
NTSTATUS Status;
|
||||
|
||||
Length = 256;
|
||||
SidBuffer = LocalAlloc(LMEM_FIXED,
|
||||
Length);
|
||||
if (SidBuffer == NULL)
|
||||
UserBuffer = LocalAlloc(LPTR, Length);
|
||||
if (UserBuffer == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Status = NtQueryInformationToken(hToken,
|
||||
TokenUser,
|
||||
(PVOID)SidBuffer,
|
||||
(PVOID)UserBuffer,
|
||||
Length,
|
||||
&Length);
|
||||
if (Status == STATUS_BUFFER_TOO_SMALL)
|
||||
{
|
||||
nsb = LocalReAlloc(SidBuffer,
|
||||
Length,
|
||||
LMEM_MOVEABLE);
|
||||
nsb = LocalReAlloc(UserBuffer, Length, LMEM_MOVEABLE);
|
||||
if (nsb == NULL)
|
||||
{
|
||||
LocalFree((HLOCAL)SidBuffer);
|
||||
LocalFree(UserBuffer);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
SidBuffer = nsb;
|
||||
UserBuffer = nsb;
|
||||
Status = NtQueryInformationToken(hToken,
|
||||
TokenUser,
|
||||
(PVOID)SidBuffer,
|
||||
(PVOID)UserBuffer,
|
||||
Length,
|
||||
&Length);
|
||||
}
|
||||
|
||||
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));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DPRINT("SidLength: %lu\n", RtlLengthSid (SidBuffer[0].Sid));
|
||||
DPRINT("SidLength: %lu\n", RtlLengthSid (UserBuffer->User.Sid));
|
||||
|
||||
Status = RtlConvertSidToUnicodeString(SidString,
|
||||
SidBuffer[0].Sid,
|
||||
UserBuffer->User.Sid,
|
||||
TRUE);
|
||||
|
||||
LocalFree((HLOCAL)SidBuffer);
|
||||
LocalFree(UserBuffer);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
|
@ -117,6 +185,7 @@ GetUserSidFromToken(HANDLE hToken,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
PSECURITY_DESCRIPTOR
|
||||
CreateDefaultSecurityDescriptor(VOID)
|
||||
{
|
||||
|
|
|
@ -814,8 +814,8 @@ GetUserProfileDirectoryW(HANDLE hToken,
|
|||
HKEY hKey;
|
||||
LONG Error;
|
||||
|
||||
if (!GetUserSidFromToken(hToken,
|
||||
&SidString))
|
||||
if (!GetUserSidStringFromToken(hToken,
|
||||
&SidString))
|
||||
{
|
||||
DPRINT1("GetUserSidFromToken() failed\n");
|
||||
return FALSE;
|
||||
|
@ -898,8 +898,8 @@ CheckForLoadedProfile(HANDLE hToken)
|
|||
|
||||
DPRINT("CheckForLoadedProfile() called\n");
|
||||
|
||||
if (!GetUserSidFromToken(hToken,
|
||||
&SidString))
|
||||
if (!GetUserSidStringFromToken(hToken,
|
||||
&SidString))
|
||||
{
|
||||
DPRINT1("GetUserSidFromToken() failed\n");
|
||||
return FALSE;
|
||||
|
@ -1166,7 +1166,7 @@ LoadUserProfileW(IN HANDLE hToken,
|
|||
}
|
||||
|
||||
/* Get user SID string */
|
||||
ret = GetUserSidFromToken(hToken, &SidString);
|
||||
ret = GetUserSidStringFromToken(hToken, &SidString);
|
||||
if (!ret)
|
||||
{
|
||||
DPRINT1("GetUserSidFromToken() failed\n");
|
||||
|
@ -1243,8 +1243,8 @@ UnloadUserProfile(HANDLE hToken,
|
|||
|
||||
RegCloseKey(hProfile);
|
||||
|
||||
if (!GetUserSidFromToken(hToken,
|
||||
&SidString))
|
||||
if (!GetUserSidStringFromToken(hToken,
|
||||
&SidString))
|
||||
{
|
||||
DPRINT1("GetUserSidFromToken() failed\n");
|
||||
return FALSE;
|
||||
|
|
Loading…
Reference in a new issue