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.
 
 
 
 
 
 

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());
}