windows-nt/Source/XPSP1/NT/base/remoteboot/riprep/compchk.cpp
2020-09-26 16:20:57 +08:00

260 lines
5.5 KiB
C++

#include "pch.h"
#pragma hdrstop
#include "compat.h"
DEFINE_MODULE( "RIPREP" )
BOOL
pIsDomainController(
IN PWSTR Server,
OUT PBOOL DomainControllerFlag
)
/*++
Routine Description:
Queries if the machine is a server or workstation via
the NetServerGetInfo API.
Arguments:
Server - The machine to query, or NULL for the local machine
DomainControllerFlag - Receives TRUE if the machine is a
domain controller, or FALSE if the
machine is a workstation.
Return value:
TRUE if the API was successful, or FALSE if not. GetLastError
gives failure code.
--*/
{
PSERVER_INFO_101 si101;
NET_API_STATUS nas;
nas = NetServerGetInfo(
Server,
101, // info-level
(PBYTE *) &si101
);
if (nas != NO_ERROR) {
SetLastError (nas);
return FALSE;
}
if ((si101->sv101_type & SV_TYPE_DOMAIN_CTRL) ||
(si101->sv101_type & SV_TYPE_DOMAIN_BAKCTRL)) {
//
// We are dealing with a DC
//
*DomainControllerFlag = TRUE;
} else {
*DomainControllerFlag = FALSE;
}
NetApiBufferFree (si101);
return TRUE;
}
BOOL
DCCheck(
PCOMPATIBILITYCALLBACK CompatibilityCallback,
LPVOID Context
)
/*++
Routine Description:
Check if the machine is a DC. If so, then we add a compatibility
entry. DC's currently cannot be duplicated by RIPREP.
Arguments:
CompatibilityCallback - pointer to call back function
Context - context pointer
Return Value:
Returns always TRUE.
--*/
{
BOOL IsDC;
if (!pIsDomainController(NULL, &IsDC) || (IsDC == TRUE)) {
RIPREP_COMPATIBILITY_ENTRY CompEntry;
WCHAR Text[100];
LoadString(g_hinstance, IDS_CANT_BE_DC_TITLE, Text, ARRAYSIZE(Text));
ZeroMemory(&CompEntry, sizeof(CompEntry));
CompEntry.SizeOfStruct= sizeof(RIPREP_COMPATIBILITY_ENTRY);
CompEntry.Description = Text;
CompEntry.TextName = L"dummy.txt";
CompEntry.MsgResourceId = IDS_CANT_BE_DC_TEXT;
CompatibilityCallback(&CompEntry,Context);
}
return(TRUE);
}
BOOL
GetProfileDirectory(
OUT PWSTR OutputBuffer
)
/*++
Routine Description:
Retrieves the local profiles directory.
We query the registry to retreive this.
Arguments:
OutputBuffer - buffer to receive the profiles directory. Assumed to be
MAX_PATH elements large.
Return Value:
Returns TRUE on success.
--*/
{
HKEY hKey;
WCHAR Buffer[MAX_PATH],ProfilePath[MAX_PATH];
DWORD Type,Size;
LONG rslt;
BOOL retval = FALSE;
*OutputBuffer = NULL;
rslt = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
L"Software\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList",
0,
KEY_QUERY_VALUE,
&hKey);
if (rslt == NO_ERROR) {
Size = sizeof(Buffer);
rslt = RegQueryValueEx(
hKey,
L"ProfilesDirectory",
NULL,
&Type,
(LPBYTE)Buffer,
&Size);
RegCloseKey(hKey);
if (rslt == NO_ERROR) {
if (ExpandEnvironmentStrings(Buffer,ProfilePath,ARRAYSIZE(ProfilePath))) {
wcscpy( OutputBuffer, ProfilePath );
retval = TRUE;
}
}
}
return(retval);
}
BOOL
MultipleProfileCheck(
PCOMPATIBILITYCALLBACK CompatibilityCallback,
LPVOID Context
)
/*++
Routine Description:
Check if the machine has multiple user profiles. If so, add a
compatibility entry.
If the machine has multiple user profiles, we want to warn the user as
there may be sensitive data under the profiles that may make it
onto a public server.
Arguments:
CompatibilityCallback - pointer to call back function
Context - context pointer
Return Value:
Returns TRUE.
--*/
{
WCHAR ProfilePath[MAX_PATH];
WIN32_FIND_DATA FindData;
DWORD DirectoryCount = 0;
BOOL DoWarning = TRUE;
if (GetProfileDirectory( ProfilePath )) {
HANDLE hFind;
wcscat( ProfilePath, L"\\*.*" );
hFind =FindFirstFile(ProfilePath,&FindData);
if (hFind != INVALID_HANDLE_VALUE) {
do {
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
DirectoryCount += 1;
}
} while ( FindNextFile( hFind, &FindData));
FindClose( hFind );
}
}
//
// if there are more than 5 directories, make a warning. These directories
// are:
// "."
// ".."
// "Administrator"
// "All Users"
// "Default User"
// "LocalService"
// "NetworkService"
//
if (DirectoryCount <= 7 && DirectoryCount != 0) {
DoWarning = FALSE;
}
if (DoWarning) {
RIPREP_COMPATIBILITY_ENTRY CompEntry;
WCHAR Text[100];
LoadString(g_hinstance, IDS_MULTIPLE_PROFILES, Text, ARRAYSIZE(Text));
ZeroMemory(&CompEntry, sizeof(CompEntry));
CompEntry.SizeOfStruct= sizeof(RIPREP_COMPATIBILITY_ENTRY);
CompEntry.Description = Text;
CompEntry.MsgResourceId = IDS_MULTIPLE_PROFILES_DESC;
CompEntry.TextName = L"dummy.txt";
CompatibilityCallback(&CompEntry,Context);
}
return(TRUE);
}