Leaked source code of windows server 2003
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

/*++
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;
}