Определение, работает ли программа на Windows Server

Я хотел бы определить, работает ли моя программа на версии Windows Server. По-видимому, System.Environment не содержит информацию о том, что Windows является серверной версией (нет такой информации в объекте версии ОС).

Я знаю, что могу использовать SystemInformation.TerminalServerSession проверять, работает ли моя программа на Удаленном рабочем столе (см. также этот вопрос), но это также будет верно, если пользователь просто получает доступ к простой клиентской машине Windows удаленно.

Так существует ли поддерживаемый способ определить, работает ли код на сервере или на клиентской машине? Я не возражаю использовать P/Invoke в случае необходимости.

Примечание: Я не хочу искать "Server" строка в названии продукта, так как это не будет, вероятно, работать над некоторыми системами из-за локализации.

12
задан Community 23 May 2017 в 12:17
поделиться

2 ответа

Благодаря указателям, предоставленным ответом Ника, я наконец нашел то, что искал. Функция 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);
}
20
ответ дан 2 December 2019 в 05:39
поделиться

Вы можете p/вызвать следующие функции Win32:

GetProductInfo для Vista/Windows Server 2008+
GetVersionEx для Windows 2000+

BJ Rollison имеет хороший пост и пример кода об этом в своем блоге.

6
ответ дан 2 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: