You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
333 lines
11 KiB
333 lines
11 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
loopuser.c
|
|
|
|
Abstract:
|
|
|
|
Loop each user and call ApplyUserSettings with user profile.
|
|
|
|
Author:
|
|
|
|
Geoffrey Guo (geoffguo) 22-Sep-2001 Created
|
|
|
|
Revision History:
|
|
|
|
<alias> <date> <comments>
|
|
|
|
--*/
|
|
#include "StdAfx.h"
|
|
#include "clmt.h"
|
|
|
|
|
|
TOKEN_PRIVILEGES PrevTokenPriv;
|
|
|
|
//--------------------------------------------------------------------------
|
|
//
|
|
// LoopUser
|
|
//
|
|
// Enumerate users and call ApplyUserSettings with user profile.
|
|
//
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
BOOL LoopUser(USERENUMPROC lpUserEnumProc)
|
|
{
|
|
BOOL fRet = TRUE;
|
|
TCHAR UserSid[MAX_PATH];
|
|
DWORD ValueType = 0;
|
|
DWORD cbUserSid = 0;
|
|
DWORD cbValueType = 0;
|
|
LONG lRet;
|
|
HKEY hKey;
|
|
PTCHAR ptr = NULL;
|
|
FILETIME ft;
|
|
TCHAR szSysDrv[3];
|
|
HRESULT hr;
|
|
TCHAR szDomainUserName[MAX_PATH];
|
|
|
|
DPF (REGmsg, L"Enter LoopUser: ");
|
|
|
|
if (ExpandEnvironmentStrings(L"%SystemDrive%",
|
|
szSysDrv,
|
|
sizeof(szSysDrv) / sizeof(TCHAR)) > 3)
|
|
{
|
|
fRet = FALSE;
|
|
DPF (REGerr, L"LoopUser: Incorrect SystemDrive: %s", szSysDrv);
|
|
goto Exit;
|
|
}
|
|
|
|
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
|
|
g_cszProfileList,
|
|
0,
|
|
KEY_READ,
|
|
&hKey);
|
|
if (lRet == ERROR_SUCCESS)
|
|
{
|
|
DWORD dwIndex = 0;
|
|
|
|
//
|
|
// Enumerate and get the Sids for each user.
|
|
//
|
|
|
|
while ( TRUE )
|
|
{
|
|
*UserSid = 0;
|
|
cbUserSid = sizeof(UserSid)/sizeof(TCHAR);
|
|
|
|
lRet = RegEnumKeyEx( hKey,
|
|
dwIndex,
|
|
UserSid,
|
|
&cbUserSid,
|
|
0,
|
|
NULL,
|
|
0,
|
|
&ft);
|
|
if (lRet != ERROR_SUCCESS)
|
|
{
|
|
if (lRet != ERROR_NO_MORE_ITEMS)
|
|
{
|
|
DPF (REGerr, L"LoopUser: RegEnumKeyEx fails. lResult=%d", lRet);
|
|
fRet = FALSE;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
CharUpper( UserSid );
|
|
|
|
//
|
|
// User Process
|
|
//
|
|
|
|
if (cbUserSid > 0)
|
|
{
|
|
LONG lLoadUser;
|
|
HKEY hKeyUser, hKeyEnv, hKeyProfileList;
|
|
TCHAR UserProfilePath[MAX_PATH];
|
|
TCHAR UserProfileHive[MAX_PATH];
|
|
TCHAR UserName[MAX_PATH];
|
|
TCHAR DomainName[MAX_PATH];
|
|
DWORD UserNameLen = sizeof(UserName)/sizeof(TCHAR);
|
|
DWORD DomainNameLen = sizeof(DomainName)/sizeof(TCHAR);
|
|
DWORD cbUserProfilePath = 0;
|
|
PSID pSid = NULL;
|
|
SID_NAME_USE sidUse;
|
|
BOOL bRet;
|
|
|
|
ConvertStringSidToSid(UserSid,&pSid);
|
|
if (!IsValidSid(pSid))
|
|
{
|
|
DPF (REGmsg, L"LoopUser: SID %s is not valid ", UserSid );
|
|
dwIndex++;
|
|
continue;
|
|
}
|
|
bRet = LookupAccountSid( NULL, pSid, UserName, &UserNameLen,
|
|
DomainName, &DomainNameLen, &sidUse );
|
|
|
|
if ( pSid )
|
|
{
|
|
LocalFree ( pSid );
|
|
pSid = NULL;
|
|
}
|
|
|
|
if ( !bRet )
|
|
{
|
|
DWORD dwErr = GetLastError();
|
|
if (ERROR_NONE_MAPPED == dwErr)
|
|
{
|
|
dwIndex++;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
DPF (REGerr, L"LoopUser: LookupAccountSid fails for %s with win32 error = %d", UserSid,dwErr);
|
|
fRet = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
lRet = RegOpenKeyEx( hKey,
|
|
UserSid,
|
|
0,
|
|
KEY_READ,
|
|
&hKeyProfileList );
|
|
|
|
if ( lRet == ERROR_SUCCESS )
|
|
{
|
|
DWORD Type;
|
|
|
|
cbUserProfilePath = sizeof( UserProfilePath );
|
|
|
|
lRet = RegQueryValueEx( hKeyProfileList,
|
|
g_cszProfileImagePath,
|
|
NULL,
|
|
&Type,
|
|
(PBYTE)UserProfilePath,
|
|
&cbUserProfilePath );
|
|
|
|
RegCloseKey( hKeyProfileList );
|
|
|
|
if ( lRet != ERROR_SUCCESS )
|
|
{
|
|
DPF (REGerr, L"LoopUser: RegQueryValueEx fails. lResult=%d", lRet);
|
|
fRet = FALSE;
|
|
dwIndex++;
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DPF (REGerr, L"LoopUser: RegOpenKeyEx fails. lResult=%d", lRet);
|
|
fRet = FALSE;
|
|
dwIndex++;
|
|
continue;
|
|
}
|
|
|
|
lRet = RegOpenKeyEx( HKEY_USERS,
|
|
UserSid,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hKeyUser);
|
|
|
|
lLoadUser = ERROR_FILE_NOT_FOUND;
|
|
|
|
if (lRet == ERROR_FILE_NOT_FOUND)
|
|
{
|
|
//
|
|
// Create NTUSER.Dat path from the user profile path
|
|
//
|
|
|
|
if (ExpandEnvironmentStrings( UserProfilePath,
|
|
UserProfileHive,
|
|
sizeof(UserProfileHive) / sizeof(TCHAR)) > MAX_PATH)
|
|
{
|
|
DPF (REGerr, L"LoopUser: Incorrect UserProfile %s", UserProfileHive);
|
|
fRet = FALSE;
|
|
goto Exit;
|
|
}
|
|
|
|
if (UserProfileHive[0] != szSysDrv[0])
|
|
{
|
|
DPF (REGwar, L"LoopUser: UserProfilePath=%s is not in System Drive, skipped.", UserProfileHive);
|
|
dwIndex++;
|
|
continue;
|
|
}
|
|
|
|
if (FAILED(StringCchCopy(UserProfilePath, MAX_PATH, UserProfileHive)))
|
|
{
|
|
DPF (REGerr, L"LoopUser: UserProfilePath too samll for %s", UserProfileHive);
|
|
fRet = FALSE;
|
|
goto Exit;
|
|
}
|
|
if (FAILED(StringCchCat(UserProfileHive, MAX_PATH, TEXT("\\NTUSER.DAT"))))
|
|
{
|
|
DPF (REGerr, L"LoopUser: UserProfilePath too samll for %s", UserProfileHive);
|
|
fRet = FALSE;
|
|
goto Exit;
|
|
}
|
|
|
|
// load the hive
|
|
// Note: if the specified hive is already loaded
|
|
// this call will return ERROR_SHARING_VIOLATION
|
|
// We don't worry about this because if the
|
|
// hive were loaded, we shouldn't be here
|
|
lLoadUser = RegLoadKey(HKEY_USERS, UserSid, UserProfileHive);
|
|
|
|
if ( lLoadUser != ERROR_SUCCESS )
|
|
{
|
|
DPF (REGerr, L"LoopUser: RegLoadKey fails. lResult=%d", lLoadUser);
|
|
fRet = FALSE;
|
|
dwIndex++;
|
|
continue;
|
|
}
|
|
|
|
lRet = RegOpenKeyEx( HKEY_USERS,
|
|
UserSid,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hKeyUser);
|
|
}
|
|
else if (lRet != ERROR_SUCCESS)
|
|
{
|
|
DPF (REGerr, L"LoopUser: RegOpenKeyEx fails. lResult=%d", lRet);
|
|
fRet = FALSE;
|
|
}
|
|
|
|
// give Call back function a chance to excute
|
|
if (DomainName[0] != TEXT('\0'))
|
|
{
|
|
hr = StringCchCopy(szDomainUserName,
|
|
ARRAYSIZE(szDomainUserName),
|
|
DomainName);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = StringCchCat(szDomainUserName,
|
|
ARRAYSIZE(szDomainUserName),
|
|
TEXT("\\"));
|
|
hr = StringCchCat(szDomainUserName,
|
|
ARRAYSIZE(szDomainUserName),
|
|
UserName);
|
|
if (FAILED(hr))
|
|
{
|
|
hr = StringCchCopy(szDomainUserName,
|
|
ARRAYSIZE(szDomainUserName),
|
|
UserName);
|
|
}
|
|
}
|
|
}
|
|
|
|
hr = lpUserEnumProc(hKeyUser, szDomainUserName, DomainName,UserSid);
|
|
if (FAILED(hr))
|
|
{
|
|
fRet = FALSE;
|
|
}
|
|
|
|
RegCloseKey( hKeyUser );
|
|
if ( lLoadUser == ERROR_SUCCESS )
|
|
RegUnLoadKey(HKEY_USERS, UserSid);
|
|
}
|
|
|
|
dwIndex++;
|
|
}
|
|
|
|
RegCloseKey( hKey );
|
|
}
|
|
else
|
|
{
|
|
DPF (REGerr, L"LoopUser: Open profile list fails. lResult=%d", lRet);
|
|
fRet = FALSE;
|
|
goto Exit;
|
|
}
|
|
|
|
// For Default User Setting
|
|
// Note the assumption here is the default user name is not localized
|
|
if (fRet)
|
|
{
|
|
lRet = RegOpenKeyEx(HKEY_USERS,
|
|
_T(".DEFAULT"),
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hKey);
|
|
|
|
if (lRet != ERROR_SUCCESS)
|
|
{
|
|
DPF (REGerr, L"LoopUser: Open Default User key fails. lResult=%d", lRet);
|
|
fRet = FALSE;
|
|
goto Exit;
|
|
}
|
|
|
|
hr = lpUserEnumProc(hKey, DEFAULT_USER, NULL,TEXT("Default_User_SID"));
|
|
if (FAILED(hr))
|
|
{
|
|
fRet = FALSE;
|
|
}
|
|
RegCloseKey( hKey );
|
|
}
|
|
|
|
Exit:
|
|
DPF (REGmsg, L"Exit LoopUser with return %d", fRet);
|
|
return fRet;
|
|
}
|