Мне известны структуры versionifo и versinfoex, переменная среды %OS% и некоторые другие вызовы API через win32, например эти: https://learn.microsoft.com/en-us/windows/win32/sysinfo/system -информационные-функции.
Однако, похоже, я не могу найти «хорошо напечатанную» версию названия ОС, поскольку они сами распечатывают ее в своем диалоговом окне «О программе». На вкладке «Характеристики Windows» в диалоговом окне «О программе» говорится следующее:
Utgåva Windows 11 Pro
Version 23H2
Installerad 2024-01-24
OS-version 22631.3593
Gränssnitt Windows Feature Experience Pack 1000.22700.1003.0
(Извините за шведского).
Меня особенно интересует программное получение первого, второго и третьего полей, надеюсь, как вызов C (вызов его из Lisp через FFI), но подойдет любой язык.
Следует отметить, что существует программа командной строки «systeminfo», которая выводит множество данных об оборудовании и некоторую информацию об ОС. Эта команда также выводит как «Имя ОС» в первом поле выше и как «Версия ОС» в третьем поле выше, но пропускает второе поле. Другая программа командной строки, «ver», печатает следующее:
Microsoft Windows [Version 10.0.22631.3593]
Может ли кто-нибудь указать мне на соответствующие функции Win32 и соответствующие структуры, чтобы получить эту информацию, как указано выше? «Обычные» GetVersionInfoEx() и компания, похоже, не предоставляют эту информацию.
Обновлено: ответ , предоставленный IInspectable , похоже, именно то, что я хотел. Упоминается в комментариях ниже.
Спасибо за все ответы и терпение.
Я понимаю. Большое спасибо за очень быстрый ответ. Однако здесь есть некоторые неточности: например, в «ProductName» указано «Windows 10 Pro», а не «Windows 11 Pro», но я вижу, что все остальное можно получить с помощью различных ключей.
внутренняя версия win 11 по-прежнему 10. так что на самом деле 11 в каком-то смысле не существует
Да я понимаю, что РбМм, но поинтересовался, откуда они печатают свою инфу для экрана "о программе". Возможно, они где-то жестко запрограммировали это, на самом деле IDK, но я думаю, что они имеют это в какой-то внутренней строке или структуре и могут извлечь их программно, когда им это нужно, поскольку по крайней мере два разных приложения показывают одну и ту же строку. Кроме того, я не понимаю, почему люди отказываются голосовать за этот вопрос. Это честный вопрос.
Просто это никогда не имело особого смысла. Помните, когда у Windows 8.1 была версия 6.3? :-)
Я помню, как они обновились с NT 4.0 до NT 5.0, и в 2000 году это произошло раньше, чем их инженеры успели закончить работу над ОС :). У нас есть NT 5.0 (W2K Pro) и NT 5.1 (Win XP). Я думаю, что Win XP была тем, чем должна была быть NT 5.0, но отдел маркетинга не мог пропустить год 2K. У меня нет проблем с тем, чтобы они хранили разные «основные» версии ядра и ОС, просто они документируют все это. Недавно я работал с консольным API, и мне пришлось переключиться в «сырой» режим. Документы MSDN были в порядке, но немного неточны, и два флага недокументированы.
Это неверная трактовка событий. XP была NT 6.0, пока (внутреннее) тестирование не выявило, что это дерьмовое программное обеспечение по сравнению с основной версией «5» на предмет равенства. Не вините Microsoft в том, что она не взломала стороннее программное обеспечение, когда клиент решил обновить Windows 2000 до Windows XP. Маркетинг вообще не имеет права голоса во внутреннем управлении версиями. Как люди приходят к таким теориям заговора?
И вот они сделали не так, как вы говорите: внутренние версии были 5.0 и 5.1; внешний W2K и XP, нет? Если бы вы спросили у маркетинга, внутренняя версия наверняка была бы 6.0 :-). Это не заговор, это полушутка-полуправда. Я не знаю, сколько вам лет, но я достаточно стар, чтобы помнить ожидание и задержки выхода NT5.0. Он должен был выйти где-то в 98-м, но этого не произошло. У них было много проблем, чтобы выпустить NT5.0. Я прочитал The New Old Thing и слежу за этим блогом в течение многих лет, поэтому знаю, насколько они заботятся об обратной совместимости и о том, чтобы не нарушать работу сторонних приложений.
Однако я ни разу не слышал, чтобы они изменили внутреннюю версию Windows XP из-за того, что какое-то «дерьмовое программное обеспечение» провело неправильное сравнение. Возможно, вы поделитесь с нами этой историей, если у вас есть ссылка? Это было бы интересное чтение и деталь истории, о которой я не знал. Когда дело доходит до ажиотажа 2000 года, это было колоссально. Во всех сферах ИТ и общества. Они не собирались выпускать больше Windows 9x после 98SE, но выпустили Windows ME. В то время было ясно, что MS не пропустит ажиотаж 2000 года по поводу выпуска новой ОС, но я думаю, что они удивили всех, выпустив ME.
Я имел в виду старую новую вещь :-)
Вы можете получить всю информацию, необходимую для создания «хорошо напечатанной» строки самостоятельно. Так в чем проблема? Не обязательно должен быть API-интерфейс ОС, который создает именно ту строку, которую вы хотите, чтобы вы могли создать эту строку — с вашей стороны просто требуется небольшая работа после анализа данных, которые вы получаете от ОС.
@JesperJuhl «Вы можете получить всю информацию, необходимую для создания «хорошо напечатанной» строки самостоятельно». - Вы не. Не существует официального документа, в котором исчерпывающе перечислялись бы все наименования поставляемой продукции. И даже если бы такой список существовал, в нем не было бы будущих выпусков (по причинам, очевидным для некоторых из нас).
Спасибо @IInspectable. Я зашёл, чтобы написать то же самое. Также отметим, что я спросил о «номере сборки» (232H в приведенном выше примере) и номерах ревизий, а не только об имени.





Microsoft в своей великой мудрости решила, что предоставление простого номера версии их ОС — это не то, чего хотят разработчики. Поэтому вместо этого они предоставили набор функций Version Helper . Вы по-прежнему можете использовать функцию GetVersionEx, но она может исчезнуть в какой-то момент в будущем. Я не нашел окончательного образца, который бы надежно предоставлял значение стандартной версии, хотя он и существует в реестре. Но также имейте в виду, что Microsoft не рекомендует полагаться на реестр, так как он также может быть изменен без предварительного уведомления.
Спасибо за ответ. Это действительно полезно, если нам нужно убедиться, что доступна минимальная версия Windows, но не в том случае, если мы хотим распечатать информацию о системе. Подумайте о функции posix «uname» и структуре utsname. Если мы не можем полагаться на реестр, и он не предоставляет эту информацию через какой-либо API, что нам следует использовать?
@myname Боюсь, вы должны мириться с тем, что предлагает Microsoft. Но вы не одиноки: многие люди считают это бесполезным.
Это не дает ответа на вопрос. Речь идет, в частности, о преобразовании информации о версии (которая в достаточной степени раскрывается различными вызовами API) в удобочитаемую текстовую строку. Последнее и есть то, о чем спрашивает этот вопрос. Бессвязные разговоры о том, что Microsoft (предположительно) неспособна предоставить доступную для чтения системную информацию, не помогают.
Счастлив и счастлив, это вопрос определения. Я просто стараюсь быть вежливым и позитивным :). Я намекнул, что информация не актуальна; вспомогательные функции полезны в другом контексте, чем то, для чего они мне нужны. Чтобы ответить на ваш другой комментарий: да, я понимаю, что мне придется использовать то, что предоставляет MS. Меня это устраивает, но я спрашиваю, предоставляют ли они что-то, о чем я не знаю и как-то пропустил, потому что, похоже, я не могу найти те строки версии, которые вижу в поле «О программе». Я отказываюсь верить, что они сшивают строки вместе в какой-то диалоговой метке на основе числа :).
@myname Новый участник не забудьте принять желаемый ответ.
К сожалению, я не думаю, что это ответ на вопрос, но мне не нравится голосовать против людей, которые пытаются быть полезными. Комментарий RbMm о поиске в реестре кажется наиболее близким к тому, что я ищу на данный момент. Я пока не знаю, является ли это ответом.
Но именно это я и пытался донести. Поскольку Microsoft приняла эту новую схему, простого и однозначного ответа не существует.
Да, я понимаю, но должен же быть какой-то способ? Они делают это сами. Я не могу себе представить причину, по которой они не предоставили бы такую простую функциональность программистам приложений. Надеюсь, нам не придется проходить через какой-то интерфейс CIM и анализировать XML только для того, чтобы получить красиво напечатанное имя ОС в том виде, в котором они его используют. Можете ли вы рассказать подробнее, почему они не рекомендуют использовать реестр? У вас есть ссылка на статью msdn или что-то в этом роде? Простите меня за то, что я ПИТА, я просто пытаюсь получить немного больше информации.
Взгляните на ответ @IIInspectable. Что-то мне тоже нужно попробовать.
@myname Система не предоставляет для этого функции, поскольку ее полезность ограничена. Система предоставляет интерфейс для сбора информации о версии в виде структурированных данных. Но даже это редко бывает полезно за пределами диагностики отчетов. Вы, конечно, не захотите использовать эти данные для принятия решений во время выполнения.
Спасибо; вот это полезно. Нет, мне не нужно это для принятия решений во время выполнения на основе младших версий Windows, я оставляю это разработчикам win32 в Microsoft. Я предпочитаю использовать их общедоступный API для того, что мне нужно сделать. Но мне нужно (вернее сказать, хочу) распечатать некоторые детали, и я не нашел способа распечатать, если я использую Windows 10 или 11. Я также был заинтригован, посмотрев на окно с информацией, поэтому хотел узнать, какие API, который они используют. Теперь я понял и рассмотрю подробнее функции DDK. Спасибо.
загляните
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion