Detecting Server Core in Code
Administrators can move between Server Core and Server with a GUI by installing or uninstalling various features, so it's important that applications designed for Server Core are able to react and behave appropriately whether running in Server Core or Server with a GUI. One way of doing this is by dynamically loading dependent libraries (for example, using LoadLibrary or LoadLibraryEx instead of static import libraries) and modifying your application's behavior if a required dependency isn't found.
Another way is by checking for the installation state of various Windows features and modifying your application's behavior accordingly. We make this possible through the public Dism APIs.
Here is some sample C++ code. It won't compile straight away, but reading over this code snippet should give you an idea about how you can check for Server Core.
What the code does
The code calls the Dism API to check the installation state of a Windows feature.
How to use it
- Determine which functionalities of your app are not available in Server Core. Features that are not available in Server Core include MMC, Internet Explorer, MSHTML, and many GUI libraries such as HTML Help and WPF. Locate the FeatureNames of those features by calling dism /online /get-features from a command prompt.
- Complete the TODO: block with your own logic that should execute when the features you selected in the previous step are not installed.
- Optionally, add additional cases to check for the other installation states. The code checks only for "Disabled with Payload Removed" state. Other states are discussed on the MSDN documentation (link below).
Code sample
HRESULT CheckFeatureState ( _featureName ) {
// Call to get feature info from Dism API:
hr = DismGetFeatureInfo ( session , _featureName , NULL , DismPackageNone , & featureInfo );
if ( S_OK != hr ) {
Log :: Error ( L"DismGetFeatureInfo failed with error code: %d" )
return hr ;
}
if ( featureInfo -> FeatureState != DismStateRemoved ) {
// Feature is "Disabled with payload removed"
// TODO: Adapt app logic here or return appropriate value
}
hr = DismDelete ( featureInfo ); // free memory allocated by DismGetFeatureInfo.
if ( S_OK != hr ) {
Log :: Error ( L"DismDelete failed with error code: %d" );
return hr ;
}
featureInfo = NULL ;
return hr ;
}
You can read more about the Dism API on MSDN: https://msdn.microsoft.com/library/windows/desktop/hh824738.aspx
Thanks for supporting Server Core through your development efforts!
The Server Core Team
Comments
Anonymous
January 01, 2003
The only case I ever needed to know if the OS is Server Core was for "Open file..." dialog on 2008 (and R2?) to provide special case. Otherwise, checking for features and gracefully degrading on unavailability was always the way to go.Anonymous
January 01, 2003
The comment has been removedAnonymous
October 21, 2013
@The Angry Technician - Yes, you can use Win32_ServerFeatureAnonymous
April 09, 2014
Using the Dism API is a very ugly method, and is not compatible with older Windows platforms.
Windows Server will install a corresponding registry value for each server level installed. You can query for the existence of these keys to determine if the Server Graphical Shell or Minimal Server Interface features are installed and enabled.
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionServerServerLevels:
NTCurrentVersionServerServerLevels:
ServerCore=1 Server Core
Server-Gui-Mgmt=1 Minimal Server Interface
Server-Gui-Shell=1 Server Graphical Shell
If Server-Gui-Shell=1, then the other two will be =1 as well.
If Server-Gui-Mgmt=1, then the ServerCore will be =1 as well.
If ServerCore does not =1, then Windows is not Server 2008 R2 or later.
Mike Ehlert - PC MicroAnonymous
April 09, 2014
It turns out the ServerLevels registry is only for Server 2012 and later... So for 2008 you will need to use the GetProductInfo function to determine if a Core version is running or not.
Mike Ehlert - PC MicroAnonymous
April 12, 2016
Thanks for sharing information
http://indguru.com/