Я хотел бы определить, работает ли моя программа на версии Windows Server. По-видимому, System.Environment
не содержит информацию о том, что Windows является серверной версией (нет такой информации в объекте версии ОС).
Я знаю, что могу использовать SystemInformation.TerminalServerSession
проверять, работает ли моя программа на Удаленном рабочем столе (см. также этот вопрос), но это также будет верно, если пользователь просто получает доступ к простой клиентской машине Windows удаленно.
Так существует ли поддерживаемый способ определить, работает ли код на сервере или на клиентской машине? Я не возражаю использовать P/Invoke в случае необходимости.
Примечание: Я не хочу искать "Server"
строка в названии продукта, так как это не будет, вероятно, работать над некоторыми системами из-за локализации.
Благодаря указателям, предоставленным ответом Ника, я наконец нашел то, что искал. Функция IsOS (OS_ANYSERVER) делает именно то, что мне нужно. Вот пример кода, который должен работать для любой версии ОС (включая до Vista, поскольку мы импортируем функцию IsOS
по порядковому номеру из shlwapi.dll
):
class OS
{
public static bool IsWindowsServer()
{
return OS.IsOS (OS.OS_ANYSERVER);
}
const int OS_ANYSERVER = 29;
[DllImport("shlwapi.dll", SetLastError=true, EntryPoint="#437")]
private static extern bool IsOS(int os);
}
Вы можете p/вызвать следующие функции Win32:
GetProductInfo для Vista/Windows Server 2008+
GetVersionEx для Windows 2000+
BJ Rollison имеет хороший пост и пример кода об этом в своем блоге.