2014-11-20 9 views
7

Najpierw chciałbym podziękować za pomoc w rozwiązaniu tego problemu. Naprawdę doceniam twój czas i wysiłek.Powershell Wyjście WMI nie pasuje C# Wyjście WMI

Tytuł podsumowuje całkiem dobrze, jednak podam kilka szczegółów. Zasadniczo, jeśli ściągnę wersję systemu operacyjnego za pomocą C#, zwróci wynik 6.2, który jest dla Windows 8, mimo że mój system ma 8.1, który powinien zwrócić 6.3. Po moich badaniach odkryłem, że jest to udokumentowane ograniczenie wewnątrz klasy System.Enviroment, ... muszę pokochać te "funkcje".

Znalazłem sposób radzenia sobie z tym, przechodząc do reg i porównując mój wynik 6.2 z aktualnym kluczem wersji w HKLM \ SOFTWARE \ Microsoft \ WindowsNT \ CurrentVersion jednak jest to bardzo ryzykowna operacja, ponieważ reg info może ulec zmianie bez powiadomienia.

Wszystko mi pomieszało, gdy próbowałem odpytać WMI za pomocą Powershell. Nie mogę sobie przypomnieć, dlaczego zrobiłem wyszukiwania WMI chociaż PowerShell, myślę, że to nie tylko koty, które się ciekawy :)


C# Kod:


string version = Environment.OSVersion.ToString(); 
MessageBox.Show(version); 
//Output "Microsoft Windows NT 6.2.9200.0" 

Kod PowerShell:


[System.Environment]::OSVersion | Select-Object -Property VersionString 
//OUtput "Microsoft Windows NT 6.3.9600.0" 

Próbowałem zarówno x86 i x64 buduje mój program C#, jak również prowadzenie PowerShell zarówno x86 i x64. Rozbieżności się nie zmieniły.

Rodzi to dla mnie kilka pytań, ale podstawową kwestią jest, skąd Powershell uzyskuje prawidłowe informacje? Czy PowerShell używa reg, tak jak planowałem naprawić jego wydajność? Ponieważ moje cele do kompilacji .Net 3.5 ma Powershell pull .Net 4.5 (zmienił moją kompilację i to nic nie zmieniło).

Z mojegorozumienia [System.Environment] :: OSVersion pobiera informacje tak samo jak System.Environment.OSVersion.

Jak do cholery działa Powershell i C# nie działa?

:) Jeszcze raz dziękuję!

+4

Sprawdzanie wersji w systemie Windows wciąż ewoluuje. Najwyraźniej właściwość .Net OSVersion zwraca wersję zgłoszoną przez funkcję Windows [GetVersionEx] (http://technet.microsoft.com/en-us/windows/system.environment.osversion (v = vs.99) .aspx). Zgodnie z [tym artykułem] (http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx) "Wprowadziliśmy kilka istotnych zmian w działaniu funkcji API GetVersion (Ex) w systemie Windows 8.1 z powodu niepożądanych zachowań klientów wynikających z wykorzystania funkcji API GetVersion (Ex) w przeszłości. "Szczegóły na tej stronie mogą pomóc w posortowaniu C#. –

Odpowiedz

2

O ile mogę powiedzieć tylko wywołanie Environment.Version w programie C# jest niepoprawny (6.2). W PowerShell jest to poprawne (6.3). W WMI wywołane za pośrednictwem PowerShell lub C# jest prawidłowe. W rzeczywistości C# skompilowany ze źródła w PowerShell przy użyciu Add-Type zwraca 6.3.

Patrząc na artykuł here (dzięki Booga Roo) oznacza to, że jeśli twoja aplikacja wyraźnie mówi, że jest skierowana do Windows 8.1 poprzez plik manifestu, otrzymujesz starszą wersję (6.2).

Można dokonać aplikacji C# zwróci poprawną wersję dodając plik manifestu aplikacji i deklarując 8.1 Wspieranie przez odkomentowanie linię

<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> 

Wydaje się bezpiecznie założyć, że pisarze PowerShell w Microsoft zawarte aplikację manifestuj się z powershell.exe, który deklaruje obsługę Windows 8.1.