260 lines
5.5 KiB
C++
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);
|
||
|
}
|
||
|
|