mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 08:55:19 +00:00
[SERVICES]
- Add loading (not used yet) and unloading of user profiles. - Create the service password secret name and pass it to LogonUserW. Patch by Hermès BÉLUSCA - MAÏTO. svn path=/trunk/; revision=73501
This commit is contained in:
parent
d915c39751
commit
ade0d2cda5
2 changed files with 64 additions and 15 deletions
|
@ -192,12 +192,15 @@ ScmLogonService(
|
|||
IN PSERVICE_IMAGE pImage)
|
||||
{
|
||||
#if 0
|
||||
PWSTR pUserName = NULL;
|
||||
PWSTR pDomainName = NULL;
|
||||
PROFILEINFOW ProfileInfo;
|
||||
PWSTR pszUserName = NULL;
|
||||
PWSTR pszDomainName = NULL;
|
||||
PWSTR pszPassword = NULL;
|
||||
PWSTR ptr;
|
||||
DWORD dwError = ERROR_SUCCESS;
|
||||
#endif
|
||||
DPRINT("ScmLogonService()\n");
|
||||
|
||||
DPRINT("ScmLogonService(%p %p)\n", pService, pImage);
|
||||
|
||||
DPRINT("Service %S\n", pService->lpServiceName);
|
||||
|
||||
|
@ -208,40 +211,77 @@ ScmLogonService(
|
|||
return ERROR_SUCCESS;
|
||||
|
||||
#if 0
|
||||
/* Get the user and domain names */
|
||||
ptr = wcschr(pImage->pszAccountName, L'\\');
|
||||
if (ptr != NULL)
|
||||
{
|
||||
*ptr = L'\0';
|
||||
|
||||
pUserName = ptr + 1;
|
||||
pDomainName = pImage->pszAccountName;
|
||||
pszUserName = ptr + 1;
|
||||
pszDomainName = pImage->pszAccountName;
|
||||
}
|
||||
else
|
||||
{
|
||||
pUserName = pImage->pszAccountName;
|
||||
pDomainName = NULL;
|
||||
pszUserName = pImage->pszAccountName;
|
||||
pszDomainName = NULL;
|
||||
}
|
||||
|
||||
if (pDomainName == NULL || wcscmp(pDomainName, L".") == 0)
|
||||
/* Build the service 'password' */
|
||||
pszPassword = HeapAlloc(GetProcessHeap(),
|
||||
HEAP_ZERO_MEMORY,
|
||||
(wcslen(pService->lpServiceName) + 5) * sizeof(WCHAR));
|
||||
if (pszPassword == NULL)
|
||||
{
|
||||
// pDomainName = computer name
|
||||
dwError = ERROR_NOT_ENOUGH_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
DPRINT("Domain: %S User: %S\n", pDomainName, pUserName);
|
||||
wcscpy(pszPassword, L"_SC_");
|
||||
wcscat(pszPassword, pService->lpServiceName);
|
||||
|
||||
/* Logon the user */
|
||||
// FIXME: Use the password!!
|
||||
if (!LogonUserW(pUserName,
|
||||
pDomainName,
|
||||
L"", // FIXME: lpszPassword,
|
||||
DPRINT("Domain: %S User: %S Password: %S\n", pszDomainName, pszUserName, pszPassword);
|
||||
|
||||
/* Service logon */
|
||||
if (!LogonUserW(pszUserName,
|
||||
pszDomainName,
|
||||
pszPassword,
|
||||
LOGON32_LOGON_SERVICE,
|
||||
LOGON32_PROVIDER_DEFAULT,
|
||||
&pImage->hToken))
|
||||
{
|
||||
dwError = GetLastError();
|
||||
DPRINT1("LogonUserW() failed (Error %lu)\n", dwError);
|
||||
goto done;
|
||||
}
|
||||
|
||||
// FIXME: Call LoadUserProfileW to be able to initialize a per-user
|
||||
// environment block, with user-specific environment variables as
|
||||
// %USERNAME%, %USERPROFILE%, and %ALLUSERSPROFILE% correctly initialized!!
|
||||
|
||||
/* Load the user profile, so that the per-user environment variables can be initialized */
|
||||
ZeroMemory(&ProfileInfo, sizeof(ProfileInfo));
|
||||
ProfileInfo.dwSize = sizeof(ProfileInfo);
|
||||
ProfileInfo.dwFlags = PI_NOUI;
|
||||
ProfileInfo.lpUserName = pszUserName;
|
||||
// ProfileInfo.lpProfilePath = NULL;
|
||||
// ProfileInfo.lpDefaultPath = NULL;
|
||||
// ProfileInfo.lpServerName = NULL;
|
||||
// ProfileInfo.lpPolicyPath = NULL;
|
||||
// ProfileInfo.hProfile = NULL;
|
||||
|
||||
if (!LoadUserProfileW(pImage->hToken, &ProfileInfo))
|
||||
{
|
||||
dwError = GetLastError();
|
||||
DPRINT1("LoadUserProfileW() failed (Error %lu)\n", dwError);
|
||||
goto done;
|
||||
}
|
||||
|
||||
pImage->hProfile = ProfileInfo.hProfile;
|
||||
|
||||
done:
|
||||
if (pszPassword != NULL)
|
||||
HeapFree(GetProcessHeap(), 0, pszPassword);
|
||||
|
||||
if (ptr != NULL)
|
||||
*ptr = L'\\';
|
||||
|
||||
|
@ -348,6 +388,10 @@ ScmCreateOrReferenceServiceImage(PSERVICE pService)
|
|||
{
|
||||
DPRINT1("ScmCreateNewControlPipe() failed (Error %lu)\n", dwError);
|
||||
|
||||
/* Unload the user profile */
|
||||
if (pServiceImage->hProfile != NULL)
|
||||
UnloadUserProfile(pServiceImage->hToken, pServiceImage->hProfile);
|
||||
|
||||
/* Close the logon token */
|
||||
if (pServiceImage->hToken != NULL)
|
||||
CloseHandle(pServiceImage->hToken);
|
||||
|
@ -421,6 +465,10 @@ ScmDereferenceServiceImage(PSERVICE_IMAGE pServiceImage)
|
|||
if (pServiceImage->hControlPipe != INVALID_HANDLE_VALUE)
|
||||
CloseHandle(pServiceImage->hControlPipe);
|
||||
|
||||
/* Unload the user profile */
|
||||
if (pServiceImage->hProfile != NULL)
|
||||
UnloadUserProfile(pServiceImage->hToken, pServiceImage->hProfile);
|
||||
|
||||
/* Close the logon token */
|
||||
if (pServiceImage->hToken != NULL)
|
||||
CloseHandle(pServiceImage->hToken);
|
||||
|
|
|
@ -51,6 +51,7 @@ typedef struct _SERVICE_IMAGE
|
|||
HANDLE hProcess;
|
||||
DWORD dwProcessId;
|
||||
HANDLE hToken;
|
||||
HANDLE hProfile;
|
||||
} SERVICE_IMAGE, *PSERVICE_IMAGE;
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue