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.
213 lines
5.8 KiB
213 lines
5.8 KiB
|
|
#include <windows.h>
|
|
#include <lm.h> // for NetGetJoinInformation
|
|
#include <Lmjoin.h>
|
|
#include <safeboot.h> // SAFEBOOT_* flags
|
|
|
|
#include "faxutil.h"
|
|
|
|
// Copy from: shell\shlwapi\apithk.c
|
|
//
|
|
// checks to see if this machine is a member of a domain or not
|
|
// NOTE: this will always return FALSE for older that win XP!
|
|
BOOL
|
|
IsMachineDomainMember()
|
|
{
|
|
static BOOL s_bIsDomainMember = FALSE;
|
|
static BOOL s_bDomainCached = FALSE;
|
|
|
|
if (IsWinXPOS() && !s_bDomainCached)
|
|
{
|
|
LPWSTR pwszDomain;
|
|
NETSETUP_JOIN_STATUS njs;
|
|
NET_API_STATUS nas;
|
|
|
|
HMODULE hNetapi32 = NULL;
|
|
NET_API_STATUS (*pfNetGetJoinInformation)(LPCWSTR, LPWSTR*, PNETSETUP_JOIN_STATUS) = NULL;
|
|
|
|
DEBUG_FUNCTION_NAME(TEXT("IsMachineDomainMember"));
|
|
|
|
//
|
|
// NetGetJoinInformation() requires Windows 2000 or later
|
|
//
|
|
hNetapi32 = LoadLibrary(TEXT("netapi32.dll"));
|
|
if(!hNetapi32)
|
|
{
|
|
DebugPrintEx(DEBUG_ERR,TEXT("LoadLibrary(netapi32.dll) failed with %ld."),GetLastError());
|
|
goto exit;
|
|
}
|
|
|
|
(FARPROC&)pfNetGetJoinInformation = GetProcAddress(hNetapi32, "NetGetJoinInformation");
|
|
if(!pfNetGetJoinInformation)
|
|
{
|
|
DebugPrintEx(DEBUG_ERR,TEXT("GetProcAddress(NetGetJoinInformation) failed with %ld."),GetLastError());
|
|
goto exit;
|
|
}
|
|
|
|
nas = pfNetGetJoinInformation(NULL, &pwszDomain, &njs);
|
|
if (nas == NERR_Success)
|
|
{
|
|
if (pwszDomain)
|
|
{
|
|
NetApiBufferFree(pwszDomain);
|
|
}
|
|
|
|
if (njs == NetSetupDomainName)
|
|
{
|
|
// we are joined to a domain!
|
|
s_bIsDomainMember = TRUE;
|
|
}
|
|
}
|
|
exit:
|
|
if(hNetapi32)
|
|
{
|
|
FreeLibrary(hNetapi32);
|
|
}
|
|
|
|
s_bDomainCached = TRUE;
|
|
}
|
|
|
|
return s_bIsDomainMember;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: IsSafeMode
|
|
//
|
|
// Synopsis: Checks the registry to see if the system is in safe mode.
|
|
//
|
|
// History: 06-Oct-00 JeffreyS Created
|
|
//
|
|
// Copy from: shell\osshell\security\rshx32\util.cpp
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL
|
|
IsSafeMode(void)
|
|
{
|
|
BOOL fIsSafeMode = FALSE;
|
|
LONG ec;
|
|
HKEY hkey;
|
|
|
|
ec = RegOpenKeyEx(
|
|
HKEY_LOCAL_MACHINE,
|
|
TEXT("SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Option"),
|
|
0,
|
|
KEY_QUERY_VALUE,
|
|
&hkey
|
|
);
|
|
|
|
if (ec == NO_ERROR)
|
|
{
|
|
DWORD dwValue;
|
|
DWORD dwValueSize = sizeof(dwValue);
|
|
|
|
ec = RegQueryValueEx(hkey,
|
|
TEXT("OptionValue"),
|
|
NULL,
|
|
NULL,
|
|
(LPBYTE)&dwValue,
|
|
&dwValueSize);
|
|
|
|
if (ec == NO_ERROR)
|
|
{
|
|
fIsSafeMode = (dwValue == SAFEBOOT_MINIMAL || dwValue == SAFEBOOT_NETWORK);
|
|
}
|
|
|
|
RegCloseKey(hkey);
|
|
}
|
|
|
|
return fIsSafeMode;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: IsGuestAccessMode
|
|
//
|
|
// Synopsis: Checks the registry to see if the system is using the
|
|
// Guest-only network access mode.
|
|
//
|
|
// History: 06-Oct-00 JeffreyS Created
|
|
//
|
|
// Copy from: shell\osshell\security\rshx32\util.cpp
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL
|
|
IsGuestAccessMode(void)
|
|
{
|
|
BOOL fIsGuestAccessMode = FALSE;
|
|
PRODUCT_SKU_TYPE skuType = GetProductSKU();
|
|
|
|
if (PRODUCT_SKU_PERSONAL == skuType)
|
|
{
|
|
// Guest mode is always on for Personal
|
|
fIsGuestAccessMode = TRUE;
|
|
}
|
|
else if (
|
|
((PRODUCT_SKU_PROFESSIONAL == skuType) || (PRODUCT_SKU_DESKTOP_EMBEDDED == skuType)) &&
|
|
!IsMachineDomainMember()
|
|
)
|
|
{
|
|
LONG ec;
|
|
HKEY hkey;
|
|
|
|
// Professional, not in a domain. Check the ForceGuest value.
|
|
|
|
ec = RegOpenKeyEx(
|
|
HKEY_LOCAL_MACHINE,
|
|
TEXT("SYSTEM\\CurrentControlSet\\Control\\LSA"),
|
|
0,
|
|
KEY_QUERY_VALUE,
|
|
&hkey
|
|
);
|
|
|
|
if (ec == NO_ERROR)
|
|
{
|
|
DWORD dwValue;
|
|
DWORD dwValueSize = sizeof(dwValue);
|
|
|
|
ec = RegQueryValueEx(hkey,
|
|
TEXT("ForceGuest"),
|
|
NULL,
|
|
NULL,
|
|
(LPBYTE)&dwValue,
|
|
&dwValueSize);
|
|
|
|
if (ec == NO_ERROR && 1 == dwValue)
|
|
{
|
|
fIsGuestAccessMode = TRUE;
|
|
}
|
|
|
|
RegCloseKey(hkey);
|
|
}
|
|
}
|
|
|
|
return fIsGuestAccessMode;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: IsSimpleUI
|
|
//
|
|
// Synopsis: Checks whether to show the simple version of the UI.
|
|
//
|
|
// History: 06-Oct-00 JeffreyS Created
|
|
// 19-Apr-00 GPease Removed CTRL key check
|
|
//
|
|
// Copy from: shell\osshell\security\rshx32\util.cpp
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL
|
|
IsSimpleUI()
|
|
{
|
|
// Show old UI in safe mode and anytime network access involves
|
|
// true user identity (server, pro with GuestMode off).
|
|
|
|
// Show simple UI anytime network access is done using the Guest
|
|
// account (personal, pro with GuestMode on) except in safe mode.
|
|
|
|
return (!IsSafeMode() && IsGuestAccessMode());
|
|
}
|
|
|