Как перевести числа версии ОС MS Windows в названия продукта в.NET?

Я не знаком с Дженкинсом, но похоже, что это 32-битный процесс.

Можете ли вы указать местоположение исполняемого файла PowerShell? Если это так, попробуйте использовать этот путь: C:\Windows\SysNative\WindowsPowerShell\v1.0\powershell.exe

Если вы не можете этого сделать, вы можете сделать это в коде в своей «последовательности выполнения» с помощью Invoke-Command:

Invoke-Command -ComputerName . -ScriptBlock { [Environment]::Is64BitProcess }

Весь код в скриптблоке будет запущен в отдельном 64-битном процессе, и результаты будут сериализованы и возвращены.

Пояснения

Пути g4]

В 32-разрядной ОС Windows системная папка C:\Windows\System32. В 64-битной ОС Windows 64-битная системная папка также C:\Windows\System32. Но системная папка для 32-битных процессов при установке 64-битной Windows фактически C:\Windows\SysWOW64.

Для совместимости 32-разрядный процесс на 64-битной ОС будет иметь любые вызовы C:\Windows\System32, прозрачно перенаправленные на C:\Windows\SysWOW64, без ведома процесса.

Чтобы включить 32 битный процесс для ссылки на real System32 на 64-битной ОС, вы можете использовать C:\Windows\SysNative.

Поскольку PowerShell имеет 32-битную и 64-битную версию и он живет внутри системных папок, вам нужно использовать приведенные выше правила для ссылки на правильный исполняемый файл в зависимости от того, вызываете ли вы его из 64- или 32-битного процесса.

Типичный сценарий (вы хотите вызвать версия той же битности) проще всего (просто назовите powershell.exe или обратитесь к ней через System32), но она становится волосатой, если вы хотите ссылаться на другую версию .

Invoke-Command Метод

Командлет Invoke-Command позволяет запускать код, как правило, на другом компьютере, но вы можете запускать его на том же компьютере. Это вызовет совершенно отдельный процесс, и любой вывод будет сериализован и отправлен обратно в вызывающий процесс.

Предостережение этому методу заключается в том, что вы должны включить удаленное управление PowerShell на машине через Enable-PSRemoting или Групповая политика (бесстыдный автозапуск).

Профиль по умолчанию (Microsoft.PowerShell), к которому вы подключаетесь на 64-битной машине, будет 64-разрядной версией PowerShell, независимо от того, OS вызывающего абонента.

Кстати, если вы хотите использовать Invoke-Command для подключения к 32-битной версии, вы можете сделать это, явно указав профиль Microsoft.PowerShell32.

30
задан Thomas Bratt 13 February 2009 в 11:51
поделиться

3 ответа

сетевая версия ОС

с практическими рекомендациями VB:

Public Function GetOSVersion() As String
    Select Case Environment.OSVersion.Platform
        Case PlatformID.Win32S
            Return "Win 3.1"
        Case PlatformID.Win32Windows
            Select Case Environment.OSVersion.Version.Minor
                Case 0
                    Return "Win95"
                Case 10
                    Return "Win98"
                Case 90
                    Return "WinME"
                Case Else
                    Return "Unknown"
            End Select
        Case PlatformID.Win32NT
            Select Case Environment.OSVersion.Version.Major
                Case 3
                    Return "NT 3.51"
                Case 4
                    Return "NT 4.0"
                Case 5
                    Select Case _
                        Environment.OSVersion.Version.Minor
                        Case 0
                            Return "Win2000"
                        Case 1
                            Return "WinXP"
                        Case 2
                            Return "Win2003"
                    End Select
                Case 6
                    Select Case _
                        Environment.OSVersion.Version.Minor
                        Case 0
                            Return "Vista/Win2008Server"
                        Case 1
                            Return "Win7/Win2008Server R2"
                        Case 2
                            Return "Win8/Win2012Server"
                        Case 3
                            Return "Win8.1/Win2012Server R2"
                    End Select
                Case 10  //this will only show up if the application has a manifest file allowing W10, otherwise a 6.2 version will be used
                  Return "Windows 10"
                Case Else
                    Return "Unknown"
            End Select
        Case PlatformID.WinCE
            Return "Win CE"
    End Select
End Function
<час>

C#

public string GetOSVersion()
{
  switch (Environment.OSVersion.Platform) {
    case PlatformID.Win32S:
      return "Win 3.1";
    case PlatformID.Win32Windows:
      switch (Environment.OSVersion.Version.Minor) {
        case 0:
          return "Win95";
        case 10:
          return "Win98";
        case 90:
          return "WinME";
      }
      break;

    case PlatformID.Win32NT:
      switch (Environment.OSVersion.Version.Major) {
        case 3:
          return "NT 3.51";
        case 4:
          return "NT 4.0";
        case 5:
          switch (Environment.OSVersion.Version.Minor) {
            case 0:
              return "Win2000";
            case 1:
              return "WinXP";
            case 2:
              return "Win2003";
          }
          break;

        case 6:
          switch(Environment.OSVersion.Version.Minor) {
            case 0:
              return "Vista/Win2008Server";
            case 1:
              return "Win7/Win2008Server R2";
            case 2:
              return "Win8/Win2012Server";
            case 3:
              return "Win8.1/Win2012Server R2";
          }
          break;
        case 10:  //this will only show up if the application has a manifest file allowing W10, otherwise a 6.2 version will be used
          return "Windows 10";
      }
      break;

    case PlatformID.WinCE:
      return "Win CE";
  }

  return "Unknown";
}
50
ответ дан Shaamaan 11 October 2019 в 13:10
поделиться

Существует пример C++ в msdn http://msdn.microsoft.com/en-us/library/ms724429 (По сравнению с 85) .aspx, наряду с примечанием, которое кто-то добавил о том, как обернуть его для использования в .NET [VB]. Это похоже на "недостающий" бит, в котором Вы нуждаетесь, функция Win32 GetProductInfo ( ссылка PInvoke.net для этого ).

Между этим и ответом от Avram, необходимо смочь собрать строку полной версии.

4
ответ дан Rob 11 October 2019 в 13:10
поделиться

Вы можете использовать WMI, чтобы получить дружественное название продукта ("Microsoft® Windows Server® 2008 Enterprise"):

using System.Management;
var name = (from x in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<ManagementObject>()
                      select x.GetPropertyValue("Caption")).First();
return name != null ? name.ToString() : "Unknown";
13
ответ дан 27 November 2019 в 23:27
поделиться
Другие вопросы по тегам:

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