Как получить подробную строку имени, версию и версию ядра Windows через API Win32?

Мне известны структуры 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 , похоже, именно то, что я хотел. Упоминается в комментариях ниже.

Спасибо за все ответы и терпение.

загляните HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

RbMm 09.06.2024 17:11

Я понимаю. Большое спасибо за очень быстрый ответ. Однако здесь есть некоторые неточности: например, в «ProductName» указано «Windows 10 Pro», а не «Windows 11 Pro», но я вижу, что все остальное можно получить с помощью различных ключей.

myname 09.06.2024 17:49

внутренняя версия win 11 по-прежнему 10. так что на самом деле 11 в каком-то смысле не существует

RbMm 09.06.2024 17:56

Да я понимаю, что РбМм, но поинтересовался, откуда они печатают свою инфу для экрана "о программе". Возможно, они где-то жестко запрограммировали это, на самом деле IDK, но я думаю, что они имеют это в какой-то внутренней строке или структуре и могут извлечь их программно, когда им это нужно, поскольку по крайней мере два разных приложения показывают одну и ту же строку. Кроме того, я не понимаю, почему люди отказываются голосовать за этот вопрос. Это честный вопрос.

myname 09.06.2024 19:54

Просто это никогда не имело особого смысла. Помните, когда у Windows 8.1 была версия 6.3? :-)

BoP 09.06.2024 20:22

Я помню, как они обновились с 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 были в порядке, но немного неточны, и два флага недокументированы.

myname 09.06.2024 20:34

Это неверная трактовка событий. XP была NT 6.0, пока (внутреннее) тестирование не выявило, что это дерьмовое программное обеспечение по сравнению с основной версией «5» на предмет равенства. Не вините Microsoft в том, что она не взломала стороннее программное обеспечение, когда клиент решил обновить Windows 2000 до Windows XP. Маркетинг вообще не имеет права голоса во внутреннем управлении версиями. Как люди приходят к таким теориям заговора?

IInspectable 09.06.2024 21:55

И вот они сделали не так, как вы говорите: внутренние версии были 5.0 и 5.1; внешний W2K и XP, нет? Если бы вы спросили у маркетинга, внутренняя версия наверняка была бы 6.0 :-). Это не заговор, это полушутка-полуправда. Я не знаю, сколько вам лет, но я достаточно стар, чтобы помнить ожидание и задержки выхода NT5.0. Он должен был выйти где-то в 98-м, но этого не произошло. У них было много проблем, чтобы выпустить NT5.0. Я прочитал The New Old Thing и слежу за этим блогом в течение многих лет, поэтому знаю, насколько они заботятся об обратной совместимости и о том, чтобы не нарушать работу сторонних приложений.

myname 10.06.2024 03:16

Однако я ни разу не слышал, чтобы они изменили внутреннюю версию Windows XP из-за того, что какое-то «дерьмовое программное обеспечение» провело неправильное сравнение. Возможно, вы поделитесь с нами этой историей, если у вас есть ссылка? Это было бы интересное чтение и деталь истории, о которой я не знал. Когда дело доходит до ажиотажа 2000 года, это было колоссально. Во всех сферах ИТ и общества. Они не собирались выпускать больше Windows 9x после 98SE, но выпустили Windows ME. В то время было ясно, что MS не пропустит ажиотаж 2000 года по поводу выпуска новой ОС, но я думаю, что они удивили всех, выпустив ME.

myname 10.06.2024 03:26

Я имел в виду старую новую вещь :-)

myname 10.06.2024 03:34

Вы можете получить всю информацию, необходимую для создания «хорошо напечатанной» строки самостоятельно. Так в чем проблема? Не обязательно должен быть API-интерфейс ОС, который создает именно ту строку, которую вы хотите, чтобы вы могли создать эту строку — с вашей стороны просто требуется небольшая работа после анализа данных, которые вы получаете от ОС.

Jesper Juhl 10.06.2024 15:43

@JesperJuhl «Вы можете получить всю информацию, необходимую для создания «хорошо напечатанной» строки самостоятельно». - Вы не. Не существует официального документа, в котором исчерпывающе перечислялись бы все наименования поставляемой продукции. И даже если бы такой список существовал, в нем не было бы будущих выпусков (по причинам, очевидным для некоторых из нас).

IInspectable 11.06.2024 12:27

Спасибо @IInspectable. Я зашёл, чтобы написать то же самое. Также отметим, что я спросил о «номере сборки» (232H в приведенном выше примере) и номерах ревизий, а не только об имени.

myname 11.06.2024 16:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
13
198
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Microsoft в своей великой мудрости решила, что предоставление простого номера версии их ОС — это не то, чего хотят разработчики. Поэтому вместо этого они предоставили набор функций Version Helper . Вы по-прежнему можете использовать функцию GetVersionEx, но она может исчезнуть в какой-то момент в будущем. Я не нашел окончательного образца, который бы надежно предоставлял значение стандартной версии, хотя он и существует в реестре. Но также имейте в виду, что Microsoft не рекомендует полагаться на реестр, так как он также может быть изменен без предварительного уведомления.

Спасибо за ответ. Это действительно полезно, если нам нужно убедиться, что доступна минимальная версия Windows, но не в том случае, если мы хотим распечатать информацию о системе. Подумайте о функции posix «uname» и структуре utsname. Если мы не можем полагаться на реестр, и он не предоставляет эту информацию через какой-либо API, что нам следует использовать?

myname 09.06.2024 20:26

@myname Боюсь, вы должны мириться с тем, что предлагает Microsoft. Но вы не одиноки: многие люди считают это бесполезным.

OldBoy 09.06.2024 21:27

Это не дает ответа на вопрос. Речь идет, в частности, о преобразовании информации о версии (которая в достаточной степени раскрывается различными вызовами API) в удобочитаемую текстовую строку. Последнее и есть то, о чем спрашивает этот вопрос. Бессвязные разговоры о том, что Microsoft (предположительно) неспособна предоставить доступную для чтения системную информацию, не помогают.

IInspectable 09.06.2024 21:48

Счастлив и счастлив, это вопрос определения. Я просто стараюсь быть вежливым и позитивным :). Я намекнул, что информация не актуальна; вспомогательные функции полезны в другом контексте, чем то, для чего они мне нужны. Чтобы ответить на ваш другой комментарий: да, я понимаю, что мне придется использовать то, что предоставляет MS. Меня это устраивает, но я спрашиваю, предоставляют ли они что-то, о чем я не знаю и как-то пропустил, потому что, похоже, я не могу найти те строки версии, которые вижу в поле «О программе». Я отказываюсь верить, что они сшивают строки вместе в какой-то диалоговой метке на основе числа :).

myname 10.06.2024 03:31

@myname Новый участник не забудьте принять желаемый ответ.

Torrecto - MSFT 10.06.2024 04:56

К сожалению, я не думаю, что это ответ на вопрос, но мне не нравится голосовать против людей, которые пытаются быть полезными. Комментарий RbMm о поиске в реестре кажется наиболее близким к тому, что я ищу на данный момент. Я пока не знаю, является ли это ответом.

myname 10.06.2024 09:31

Но именно это я и пытался донести. Поскольку Microsoft приняла эту новую схему, простого и однозначного ответа не существует.

OldBoy 10.06.2024 10:18

Да, я понимаю, но должен же быть какой-то способ? Они делают это сами. Я не могу себе представить причину, по которой они не предоставили бы такую ​​простую функциональность программистам приложений. Надеюсь, нам не придется проходить через какой-то интерфейс CIM и анализировать XML только для того, чтобы получить красиво напечатанное имя ОС в том виде, в котором они его используют. Можете ли вы рассказать подробнее, почему они не рекомендуют использовать реестр? У вас есть ссылка на статью msdn или что-то в этом роде? Простите меня за то, что я ПИТА, я просто пытаюсь получить немного больше информации.

myname 10.06.2024 12:18

Взгляните на ответ @IIInspectable. Что-то мне тоже нужно попробовать.

OldBoy 10.06.2024 14:12

@myname Система не предоставляет для этого функции, поскольку ее полезность ограничена. Система предоставляет интерфейс для сбора информации о версии в виде структурированных данных. Но даже это редко бывает полезно за пределами диагностики отчетов. Вы, конечно, не захотите использовать эти данные для принятия решений во время выполнения.

IInspectable 10.06.2024 14:49

Спасибо; вот это полезно. Нет, мне не нужно это для принятия решений во время выполнения на основе младших версий Windows, я оставляю это разработчикам win32 в Microsoft. Я предпочитаю использовать их общедоступный API для того, что мне нужно сделать. Но мне нужно (вернее сказать, хочу) распечатать некоторые детали, и я не нашел способа распечатать, если я использую Windows 10 или 11. Я также был заинтригован, посмотрев на окно с информацией, поэтому хотел узнать, какие API, который они используют. Теперь я понял и рассмотрю подробнее функции DDK. Спасибо.

myname 10.06.2024 15:30

Другие вопросы по теме