Anzeige

Am Puls von Microsoft

Anzeige

Kleineres Powershell Problem

Mach Dir keinen Kopp...

Wie schon erwähnt... ich habe es eh drangegeben und mir so beholfen:
Code:
Add-Type -AssemblyName System.Windows.Forms
$screen_cnt  = [System.Windows.Forms.Screen]::AllScreens.Count
$col_screens = [system.windows.forms.screen]::AllScreens
    $Host.UI.RawUI.WindowTitle = 'Abfrage von Kerndaten'
    $Mein_Betriebssystem = (Get-CimInstance Win32_OperatingSystem).Caption
    $Version = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').DisplayVersion
    $Architektur = (Get-CimInstance Win32_operatingsystem).OSArchitecture
    $Buildnummer = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').CurrentBuild
    $Erweiterung = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').UBR
    $Computername = (Get-CimInstance Win32_ComputerSystem).Name
    $Meine_Domaene = (Get-CimInstance Win32_ComputerSystem).Domain
    $Benutzername = ($env:UserName)
    $User_ID = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
$esc = [char]27
Write-Host ('
Die wichtigsten Kerndaten dieses Systems werden hier mit Powershell angezeigt.')
Write-Host
Write-Host Auf Ihrem Coumputer ist $Mein_Betriebssystem, Version $Version als $Architektur Betriebssystem installiert.
Write-Host Die momentane Buildnummer lautet $Buildnummer'.'$Erweiterung'.'
Write-Host Der Name dieses Computers lautet $Computername'.'
Write-Host Der Name der Arbeitsgruppe lautet $Meine_Domaene'.'
Write-Host Die User-ID des momentan angemeldeten Benutzers $Benutzername lautet $User_ID'.'
Write-Host
if ($screen_cnt -gt 1) {write-host Nur bei einer Skalierung von 100 Prozent wird die Auflösung der Anzeigen richtig dargestellt.}
if ($screen_cnt -eq 1) {write-host Nur bei einer Skalierung von 100 Prozent wird die Auflösung der Anzeige richtig dargestellt.}
$info_screens = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type = "Die primäre Anzeige hat eine Auflösung von"} else {$monitor_type = "Die sekundäre Anzeige hat eine Auflösung von"}write-host $monitor_type "$($_.Bounds.Width) Bildpunkten horizontal und $($_.Bounds.Height) Bildpunkten vertikal."})
$info_screens
write-host
Write-Host Hier werden Ihnen nur die zuletzt installierten Windows Updates in aufsteigender Reihenfolge angezeigt.
Write-Host "Darunter fallen jedoch nicht Treiber, Office oder unter WSUS empfangene Updates."
Write-Host WSUS steht für Windows Server Update Services. Die Server sind von Microsoft.
Write-Host `n'HotFixID  Beschreibung    Installiert am     (Eine genaue Uhrzeitauflösung ist nicht möglich).'
Write-Host --------- --------------- -------------------
Get-HotFix | Select-Object -Property HotFixID, Description, Installedon | Sort-Object -Property InstalledOn | Format-Table -HideTableHeaders
Write-Host 'Zum Beenden drücken Sie eine beliebige Taste . . . '-NoNewLine;[void]($Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'));Write-Host
exit

und Ruhe is.....
 
Anzeige
Das Problem besteht wohl auch darin, dass die CIM Instance 32 Umgebung bei Skalierungen die richtige
Bildschirmauflösung in Powershell nicht aufgebröselt bekommt.
Gerade bei hohen Auflösungen und Skalierungen mit mehreren Monitoren fällt das ins Gewicht.
Weiterhin sagt Powershell
Code:
$firstscreenheight = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Height
$firstscreenwidth = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds.width
Wenn Powershell unterscheiden würde... sagen wir mal so:
Code:
$firstscreenheight = [System.Windows.Forms.Screen]::ScecondaryScreen.Bounds.Height
$firstscreenwidth = [System.Windows.Forms.Screen]::SecondayScreen.Bounds.width
wäre das klasse und würde vieles erleichtern.
Aber selbst dann sind immer noch Klimmzüge notwendig, wo man sagt
Beispiel Real Auflösung 1920 * 1080 wenn skaliert mit 125% Anzeige der Auflösung nur bei 1536 * 864.
Da für jede Auflösung dann eine If then Bedingung in Powershell zu machen, ist mir zu stressig.
Eine Möglichkeit wäre noch als Beispiel mit ´nem Multiplikator zu arbeiten.
Bei 1366 Bildpunkten Realauflösung wäre der skalierte Wert 1093.
1093 mal 1,25 (125 % Skalierung) ergibt aber schon 1366,25 usw.
Das wäre dann eine endlose Rumprobiererrei, bis man für jede Skalierung und Auflösung bei jedem Monitor
die richtigen Werte zusammen hätte.
neeee zu viel Aufwand.
Leider hilft hier weder Drittanbieter-Software von NIR-Soft noch qres.exe oder die 2. qres.exe,
die ich noch zusätzlich im Internet gefunden, habe weiter.
 
Soooooooooooooooo
Zumindest ein kleines Stückchen bin ich im Powershellskript für die Bildschirmauflösung weiter gekommen.
Zunächst einmal habe ich bei zwei Monitoren jetzt eine Lösung, wo die Werte
für die horizontale und vertikale Auflösung einzeln in einer Variable in Powershell verwurstet sind.
Und das für jeden der beiden Monitore getrennt. Momentan aber nur bei einer Skalierung von 100%.
Mit den Skalierungswerten muss ich noch mal schauen, wie ich das am Besten hinbekomme.
Eine Drei-Monitorlösung kann ich noch nicht anbieten...
Zumindest schon mal der Fortschritt, dass die Auflösungswerte jetzt einzeln zur Verfügung stehen.
Code:
 clear-host
Add-Type -AssemblyName System.Windows.Forms
$screen_count  = [System.Windows.Forms.Screen]::AllScreens.Count
$col_screens = [system.windows.forms.screen]::AllScreens
    $Host.UI.RawUI.WindowTitle = 'Abfrage der Auflösung'
$info_screens_1 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type_1_horizontal = $($_.Bounds.Width)}})
$info_screens_1 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type_1_vertical = $($_.Bounds.height)}})

write-host $monitor_type_1_horizontal, $monitor_type_1_vertical
pause
$info_screens_2 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "False") {$monitor_type_2_horizontal = $($_.Bounds.Width)}})
$info_screens_2 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "False") {$monitor_type_2_vertical = $($_.Bounds.height)}})

if ($screen_count -gt 1) {write-host $monitor_type_2_horizontal, $monitor_type_2_vertical}
pause
 
Zuletzt bearbeitet:
Und wieder bin ich ein Stück weiter gekommen.
Hiermit ermittelt man den Skalierungswert der primären Anzeige:
Code:
clear-host
Add-Type @'
using System;
using System.Runtime.InteropServices;
using System.Drawing;

public class DPI {[DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); public enum DeviceCap {VERTRES = 10, DESKTOPVERTRES = 117 }

  public static float scaling() {Graphics g = Graphics.FromHwnd(IntPtr.Zero); IntPtr desktop = g.GetHdc(); int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); return (float)PhysicalScreenHeight / (float)LogicalScreenHeight;}}
'@ -ReferencedAssemblies 'System.Drawing.dll' -ErrorAction Stop
$First_Monitor_DPI_Scaling = [DPI]::scaling()
if ($First_Monitor_DPI_Scaling -gt 1) {$First_Monitor_DPI_Scaling = [math]::round($First_Monitor_DPI_Scaling,2)} else {$First_Monitor_DPI_Scaling = 1}
write-host $First_Monitor_DPI_Scaling
pause

Das muss ich nur noch für einen zweiten Monitor hinbekommen.
Wenn ich das schaffe ist der Rest im Grunde ein Kinderspiel...
Bei einer Skalierung von 125 Prozent bzw. 1,25 Skalierungsfaktor multipliziere im Powershellskript
die Auflösungswerte mit dem Skalierungsfaktor. So bekomme ich den Realwert der Auflösung bei
Saklierung des Monitors angezeigt.
Bei 1366 Bildpunkten horizontal eben abrunden von 1093 * 1,25 = 1366,25 auf den Wert 1366.
Bei 768 Bildpunkten vertikal eben abrunden von 614 * 1,25 = 768,5 auf den Wert 768.
usw.
Bei den anderen Werten mit z.B. einer Auflösung von 1920*1080 ist das Multiplizieren dann kein Problem,
da 1536 * 1,25 1920 ergibt und 864 * 1,25 1080 ergibt.
Zum Umwandeln in ein Powershellskript muss die Datei im Anhang von .txt in .ps1 umbenannt werden.

Des Weiteren gibt es in der Registry den Eintrag HKCU\Control Panel\Desktop\PerMonitorSettings.
Zumindest dann , wenn man am Computer mehrere Monitore angeschlossen hat.
Da dann für jeden Monitor den DPIScale Wert auszulesen ist auch kein Ding, aber bei
vielen eingetragenen Monitoren wird es u. U. schwierig den richtigen raus zu finden...
Der DPIScale Wert (DPIValue) speichert den Wert für den jeweiligen Monitor ab.
0 ist z. B. immer der empfohlene Wert. Bei einer Auflösung von 1366 * 768 sind das 100 Prozent am Notebook.
1 wäre dann in diesem Fall 125 Prozent, da eine Stufe höher als der empfohlene Wert.
2 wäre dann in diesem Fall 150 Prozent, da zwei Stufen höher als der empfohlene Wert. usw.
Bei meinem 32 Zoll TV mit 1920 * 1080 schreibt MS als empfohlenen Wert 150 Prozent für die Skalierung aus.
Dies entspricht dann dem Wert DPIValue = 0.
Wählt man jetzt als Saklierung nur 125 Prozent anstatt der 150 Prozent aus, so wird beim mir der Wert in der Registry
mit 4294967295 angegeben. Bei 100 Prozent ist der Wert in der Registry bei 4294967294.
Diese Werte beliben in der Registry bestehen und werden beim wieder anklemmen dieses Gerätes auch wieder
genauso eingestellt. Hilfreich sind diese Werte aber nicht bei der Erfassung der Auflösung bzw. Saklierung
in einem Powershellskript.
 

Anhänge

  • Get_DPI_Scaling_Monitor_1.txt
    909 Bytes · Aufrufe: 15
Zuletzt bearbeitet:
So. Für den ersten Monitor ist es geschafft. Egal welche Auflösung oder Skalierung verwendet wird,
die Werte stimmen jetzt und es werden die Real-Werte durch Powershell richtig angezeigt. Hurrah...........
Bei dem zweiten Monitor brauche ich noch dringend Hilfe...
Ich lege das Skript mal hier hinein:
Code:
clear-host
    $Host.UI.RawUI.WindowTitle = 'Abfrage von Kerndaten'
    $Mein_Betriebssystem = (Get-CimInstance Win32_OperatingSystem).Caption
    $Version = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').DisplayVersion
    $Architektur = (Get-CimInstance Win32_operatingsystem).OSArchitecture
    $Buildnummer = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').CurrentBuild
    $Erweiterung = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').UBR
    $Computername = (Get-CimInstance Win32_ComputerSystem).Name
    $Meine_Domaene = (Get-CimInstance Win32_ComputerSystem).Domain
    # $Benutzername = (Get-CimInstance Win32_ComputerSystem).PrimaryOwnerName
    $Benutzername = ($env:UserName)
    $User_ID = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
Add-Type -AssemblyName System.Windows.Forms
$screen_count  = [System.Windows.Forms.Screen]::AllScreens.Count
$col_screens = [system.windows.forms.screen]::AllScreens
$info_screens_1 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type_1_horizontal = $($_.Bounds.Width)}})
$info_screens_1 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type_1_vertical = $($_.Bounds.height)}})
clear-host

# ______________________________________________________________________________________________________________________________________________________________________

Add-Type @'
using System;
using System.Runtime.InteropServices;
using System.Drawing;

public class DPI {[DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); public enum DeviceCap {VERTRES = 10, DESKTOPVERTRES = 117 }

 public static float scaling() {Graphics g = Graphics.FromHwnd(IntPtr.Zero); IntPtr desktop = g.GetHdc(); int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); return (float)PhysicalScreenHeight / (float)LogicalScreenHeight;}}
'@ -ReferencedAssemblies 'System.Drawing.dll' -ErrorAction Stop
$First_Monitor_DPI_Scaling = [DPI]::scaling()
if ($First_Monitor_DPI_Scaling -gt 1) {$First_Monitor_DPI_Scaling = [math]::round($First_Monitor_DPI_Scaling,2)} else {$First_Monitor_DPI_Scaling = 1}


if ($First_Monitor_DPI_Scaling -gt 1) {$monitor_type_1_horizontal = $monitor_type_1_horizontal * $First_Monitor_DPI_Scaling}
if ($First_Monitor_DPI_Scaling -gt 1) {$monitor_type_1_vertical = $monitor_type_1_vertical * $First_Monitor_DPI_Scaling}

$monitor_type_1_horizontal=[math]::Round($monitor_type_1_horizontal)
$monitor_type_1_vertical=[math]::Round($monitor_type_1_vertical)

# ______________________________________________________________________________________________________________________________________________________________________

$info_screens_2 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "False") {$monitor_type_2_horizontal = $($_.Bounds.Width)}})
$info_screens_2 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "False") {$monitor_type_2_vertical = $($_.Bounds.height)}})

 if ($monitor_type_2_horizontal -eq 1093) {$monitor_type_2_horizontal=1366}
 if ($monitor_type_2_vertical -eq 614) {$monitor_type_2_vertical=768}
 if ($monitor_type_2_horizontal -eq 1536) {$monitor_type_2_horizontal=1920}
 if ($monitor_type_2_vertical -eq 864) {$monitor_type_2_vertical=1080}
 if ($monitor_type_2_horizontal -eq 1280) {$monitor_type_2_horizontal=1920}
 if ($monitor_type_2_vertical -eq 720) {$monitor_type_2_vertical=1080}
 if ($monitor_type_2_horizontal -eq 1097) {$monitor_type_2_horizontal=1920}
 if ($monitor_type_2_vertical -eq 617) {$monitor_type_2_vertical=1080}
 if ($monitor_type_2_vertical -eq 614) {$monitor_type_2_vertical = 768}
 if ($monitor_type_2_vertical -eq 800) {$monitor_type_2_vertical = 1600}
 if ($monitor_type_2_vertical -eq 1267) {$monitor_type_2_vertical = 1600}
 if ($monitor_type_2_vertical -eq 1234) {$monitor_type_2_vertical = 1600}
 if ($monitor_type_2_horizontal -eq 1344) {$monitor_type_2_horizontal = 1680}
 if ($monitor_type_2_vertical -eq 840) {$monitor_type_2_vertical = 1050}
 if ($monitor_type_2_horizontal -eq 1120) {$monitor_type_2_horizontal = 1680}
 if ($monitor_type_2_vertical -eq 700) {$monitor_type_2_vertical = 1050}
 if ($monitor_type_2_horizontal -eq 960) {$monitor_type_2_horizontal = 1680}
 if ($monitor_type_2_vertical -eq 600) {$monitor_type_2_vertical = 1050}
 if ($monitor_type_2_horizontal -eq 6016) {$monitor_type_2_horizontal = 4096}
 if ($monitor_type_2_vertical -eq 2160) {$monitor_type_2_vertical = 2160}
 if ($monitor_type_2_horizontal -eq 5197) {$monitor_type_2_horizontal = 4096}
 if ($monitor_type_2_vertical -eq 1728) {$monitor_type_2_vertical = 2160}
 if ($monitor_type_2_horizontal -eq 4651) {$monitor_type_2_horizontal = 4096}
 if ($monitor_type_2_vertical -eq 1440) {$monitor_type_2_vertical = 2160}
 if ($monitor_type_2_horizontal -eq 4261) {$monitor_type_2_horizontal = 4096}
 if ($monitor_type_2_vertical -eq 1234) {$monitor_type_2_vertical = 2160}
 if ($monitor_type_2_horizontal -eq 3968) {$monitor_type_2_horizontal = 4096}
 if ($monitor_type_2_horizontal -eq 3740) {$monitor_type_2_horizontal = 4096}
 if ($monitor_type_2_horizontal -eq 3968) {$monitor_type_2_vertical = 2160}
 if ($monitor_type_2_horizontal -eq 5760) {$monitor_type_2_horizontal = 3840}
 if ($monitor_type_2_vertical -eq 2160) {$monitor_type_2_vertical = 2160}
 if ($monitor_type_2_horizontal -eq 4992) {$monitor_type_2_horizontal = 3840}
 if ($monitor_type_2_horizontal -eq 4480) {$monitor_type_2_horizontal = 3840}
 if ($monitor_type_2_horizontal -eq 4114) {$monitor_type_2_horizontal = 3840}
 if ($monitor_type_2_horizontal -eq 3840) {$monitor_type_2_horizontal = 3840}
 if ($monitor_type_2_horizontal -eq 3627) {$monitor_type_2_horizontal = 3840}
 if ($monitor_type_2_vertical -eq 1234) {$monitor_type_2_vertical = 1600}
 if ($monitor_type_2_vertical -eq 1600) {$monitor_type_2_horizontal = 2560}
 if ($monitor_type_2_horizontal -eq 1707) {$monitor_type_2_horizontal = 2560}
 if ($monitor_type_2_vertical -eq 1067) {$monitor_type_2_vertical = 1600}
 if ($monitor_type_2_horizontal -eq 1463) {$monitor_type_2_horizontal = 2560}
 if ($monitor_type_2_vertical -eq 914) {$monitor_type_2_vertical = 1600}
 if ($monitor_type_2_horizontal -eq 3901) {$monitor_type_2_horizontal = 2560}
 if ($monitor_type_2_horizontal -eq 2194) {$monitor_type_2_horizontal = 2560}
 if ($monitor_type_2_horizontal -eq 3840 -and $computername -eq "Contzen-NB1") {$monitor_type_2_horizontal = 3840}
 if ($monitor_type_2_vertical -eq 1080 -and $computername -eq "Contzen-NB1") {$monitor_type_2_vertical = 1600}
 if ($monitor_type_2_vertical -eq 1080 -and $computername -eq "Contzen-NB1") {$monitor_type_2_horizontal = 2560}
 if ($monitor_type_2_vertical -eq 1024) {$monitor_type_2_horizontal = 1280}
 if ($monitor_type_2_vertical -eq 819) {$monitor_type_2_horizontal = 1280}
 if ($monitor_type_2_vertical -eq 819) {$monitor_type_2_vertical = 1024}
 if ($monitor_type_2_vertical -eq 683) {$monitor_type_2_horizontal = 1280}
 if ($monitor_type_2_vertical -eq 683) {$monitor_type_2_vertical = 1024}


$esc = [char]27

Write-Host ('
Die wichtigsten Kerndaten dieses Systems werden hier mit Powershell angezeigt.')
Write-Host
Write-Host Auf Ihrem Coumputer ist $Mein_Betriebssystem, Version $Version als $Architektur Betriebssystem installiert.
Write-Host
Write-Host Die momentane Buildnummer lautet $Buildnummer'.'$Erweiterung'.'
Write-Host
Write-Host Der Name dieses Computers lautet $Computername'.'
Write-Host
Write-Host Der Name der Arbeitsgruppe lautet $Meine_Domaene'.'
Write-Host
Write-Host Die User-ID des momentan angemeldeten Benutzers $Benutzername lautet $User_ID'.'
write-host
if ($screen_count -eq 1) {write-host "Die primäre Anzeige hat eine Auflösung von $monitor_type_1_horizontal Bildpunkten horizontal und $monitor_type_1_vertical Bildpunkten vertikal."}
if ($screen_count -gt 1) {write-host "Die primäre   Anzeige hat eine Auflösung von $monitor_type_1_horizontal Bildpunkten horizontal und $monitor_type_1_vertical Bildpunkten vertikal."}
if ($screen_count -gt 1) {write-host "Die sekundäre Anzeige hat eine Auflösung von $monitor_type_2_horizontal Bildpunkten horizontal und $monitor_type_2_vertical Bildpunkten vertikal."}
Write-Host Hier werden Ihnen nur die zuletzt installierten Windows Updates in aufsteigender Reihenfolge angezeigt.
Write-Host "Darunter fallen jedoch nicht Treiber, Office oder unter WSUS empfangene Updates."
Write-Host WSUS steht für Windows Server Update Services. Die Server sind von Microsoft.
Write-Host `n'HotFixID  Beschreibung    Installiert am     (Eine genaue Uhrzeitauflösung ist nicht möglich).'
Write-Host ----------------------------------------------------------------------------------------------
Get-HotFix | Select-Object -Property HotFixID, Description, Installedon | Sort-Object -Property InstalledOn | Format-Table -HideTableHeaders
Write-Host 'Zum Beenden drücken Sie eine beliebige Taste . . . '-NoNewLine;[void]($Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'));Write-Host
# D:\Programme\batch\Info_Center_Settings.bat
exit
Bitte bedenken... Die Zeilen mit dem Contzen-NB1 sind nur ein Test und zeigen meine verzweifelte Lage.
Es muss doch eine Möglichkeit existieren, die Skalierung des zweiten Monitors rauszubekommen,
genau so wie beim ersten Monitor. Zwei Monitore, das würde ja reichen für mich und meine "Kunden".
Keiner von "uns" hat mehr als zwei Monitore am Computer angeschlossen.
 

Anhänge

  • Check_for_Updates.txt
    9,1 KB · Aufrufe: 15
Zuletzt bearbeitet:
In der folgenden Ansicht habe ich mal die Problemstellung für den zweiten Monitor markiert.
1724015170843.png



In den beiden Zeilen (mit rotem Pfeil marikert, liegt das Geheimnis,
wie und wo der zweite Monitor mit seiner Skalierung definiert wird!
Ich lege die Datei
sowohl als Skript und auch im Anhang als Textdatei mal ab...
[CODE}
clear-host
$Host.UI.RawUI.WindowTitle = 'Abfrage von Kerndaten'
$Mein_Betriebssystem = (Get-CimInstance Win32_OperatingSystem).Caption
$Version = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').DisplayVersion
$Architektur = (Get-CimInstance Win32_operatingsystem).OSArchitecture
$Buildnummer = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').CurrentBuild
$Erweiterung = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').UBR
$Computername = (Get-CimInstance Win32_ComputerSystem).Name
$Meine_Domaene = (Get-CimInstance Win32_ComputerSystem).Domain
# $Benutzername = (Get-CimInstance Win32_ComputerSystem).PrimaryOwnerName
$Benutzername = ($env:UserName)
$User_ID = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
Add-Type -AssemblyName System.Windows.Forms
$screen_count = [System.Windows.Forms.Screen]::AllScreens.Count
$col_screens = [system.windows.forms.screen]::AllScreens

clear-host

# ______________________________________________________Anfang Screen 1________________________________________________________________________________________________________

$info_screens_1 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type_1_horizontal = $($_.Bounds.Width)}})
$info_screens_1 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type_1_vertical = $($_.Bounds.height)}})

Add-Type @'
using System;
using System.Runtime.InteropServices;
using System.Drawing;

public class DPI {[DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); public enum DeviceCap {VERTRES = 10, DESKTOPVERTRES = 117}

public static float scaling() {Graphics g = Graphics.FromHwnd(IntPtr.Zero); IntPtr desktop = g.GetHdc(); int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); return (float)PhysicalScreenHeight / (float)LogicalScreenHeight;}}
'@ -ReferencedAssemblies 'System.Drawing.dll' -ErrorAction Stop
$First_Monitor_DPI_Scaling = [DPI]::scaling()
if ($First_Monitor_DPI_Scaling -gt 1) {$First_Monitor_DPI_Scaling = [math]::round($First_Monitor_DPI_Scaling,2)} else {$First_Monitor_DPI_Scaling = 1}


if ($First_Monitor_DPI_Scaling -gt 1) {$monitor_type_1_horizontal = $monitor_type_1_horizontal * $First_Monitor_DPI_Scaling}
if ($First_Monitor_DPI_Scaling -gt 1) {$monitor_type_1_vertical = $monitor_type_1_vertical * $First_Monitor_DPI_Scaling}

$monitor_type_1_horizontal=[math]::Round($monitor_type_1_horizontal)
$monitor_type_1_vertical=[math]::Round($monitor_type_1_vertical)

# ______________________________________________________Ende Screen 1________________________________________________________________________________________________________






# ______________________________________________________Anfang Screeen 2_______________________________________________________________________________________________________


$info_screens_2 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "False") {$monitor_type_2_horizontal = $($_.Bounds.Width)}})
$info_screens_2 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "False") {$monitor_type_2_vertical = $($_.Bounds.height)}})


Add-Type @'
using System;
using System.Runtime.InteropServices;
using System.Drawing;

public class DPI2 {[DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); public enum DeviceCap {VERTRES = 10, DESKTOPVERTRES = 117}

public static float scaling() {Graphics g = Graphics.FromHwnd(IntPtr.Zero); IntPtr desktop = g.GetHdc(); int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); return (float)PhysicalScreenHeight / (float)LogicalScreenHeight;}}
'@ -ReferencedAssemblies 'System.Drawing.dll' -ErrorAction Stop
$Second_Monitor_DPI_Scaling = [DPI2]::scaling()
if ($second_Monitor_DPI_Scaling -gt 1) {$Second_Monitor_DPI_Scaling = [math]::round($Second_Monitor_DPI_Scaling,2)} else {$Second_Monitor_DPI_Scaling = 1}


if ($Second_Monitor_DPI_Scaling -gt 1) {$monitor_type_2_horizontal = $monitor_type_2_horizontal * $Second_Monitor_DPI_Scaling}
if ($Second_Monitor_DPI_Scaling -gt 1) {$monitor_type_2_vertical = $monitor_type_2_vertical * $Second_Monitor_DPI_Scaling}

$monitor_type_2_horizontal=[math]::Round($monitor_type_2_horizontal)
$monitor_type_2_vertical=[math]::Round($monitor_type_2_vertical)



# __________________________________________________________Ende Screen 2____________________________________________________________________________________________________

$esc = [char]27

Write-Host ('
Die wichtigsten Kerndaten dieses Systems werden hier mit Powershell angezeigt.')
Write-Host
Write-Host Auf Ihrem Coumputer ist $Mein_Betriebssystem, Version $Version als $Architektur Betriebssystem installiert.
Write-Host
Write-Host Die momentane Buildnummer lautet $Buildnummer'.'$Erweiterung'.'
Write-Host
Write-Host Der Name dieses Computers lautet $Computername'.'
Write-Host
Write-Host Der Name der Arbeitsgruppe lautet $Meine_Domaene'.'
Write-Host
Write-Host Die User-ID des momentan angemeldeten Benutzers $Benutzername lautet $User_ID'.'
write-host
if ($screen_count -eq 1) {write-host "Die primäre Anzeige hat eine Auflösung von $monitor_type_1_horizontal Bildpunkten horizontal und $monitor_type_1_vertical Bildpunkten vertikal."}
if ($screen_count -gt 1) {write-host "Die primäre Anzeige hat eine Auflösung von $monitor_type_1_horizontal Bildpunkten horizontal und $monitor_type_1_vertical Bildpunkten vertikal."}
if ($screen_count -gt 1) {write-host "Die sekundäre Anzeige hat eine Auflösung von $monitor_type_2_horizontal Bildpunkten horizontal und $monitor_type_2_vertical Bildpunkten vertikal."}
Write-Host Hier werden Ihnen nur die zuletzt installierten Windows Updates in aufsteigender Reihenfolge angezeigt.
Write-Host "Darunter fallen jedoch nicht Treiber, Office oder unter WSUS empfangene Updates."
Write-Host WSUS steht für Windows Server Update Services. Die Server sind von Microsoft.
Write-Host `n'HotFixID Beschreibung Installiert am (Eine genaue Uhrzeitauflösung ist nicht möglich).'
Write-Host ----------------------------------------------------------------------------------------------
Get-HotFix | Select-Object -Property HotFixID, Description, Installedon | Sort-Object -Property InstalledOn | Format-Table -HideTableHeaders
Write-Host 'Zum Beenden drücken Sie eine beliebige Taste . . . '-NoNewLine;[void]($Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'));Write-Host
# D:\Programme\batch\Info_Center_Settings.bat
exit
[/CODE]

Wenn "wir" das noch in den Griff bekommen ist das Powershell-Skript perfekt zur Auslieferung!

Und... Von wegen Künstliche Intellenz ;););)
 

Anhänge

  • Check_for_Updates.txt
    6,7 KB · Aufrufe: 16
Die Zeilen mit der Hot-Fix Abfrage (Installierte Updates) habe ich noch ein bisschen verfeinert.
Code:
Write-Host "HotFixID  Beschreibung    Installiert am:"
Write-Host -----------------------------------------
Get-HotFix | Select-Object -Property HotFixID, Description, @{Name='InstalledOn'; Expression={($_.InstalledOn).ToString('dd.MM.yyyy')}} | Sort-Object -Property HotFixID | Format-Table -HideTableHeaders
Write-Host 'Zum Beenden drücken Sie eine beliebige Taste . . . '-NoNewLine;[void]($Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'));Write-Host
So wird eben nur noch das Datum angezeigt und keine Uhrezit mehr.
Die lies sich ja sowieso nicht aufbröseln!
Ausserdem funktioniert die Sortierung nach Datum ohne die Uhrzeitanzeige (Installedon) nicht mehr richtig.
Deshalb habe ich die Sortierung auf HotFixID umgestellt.
Die HotFixID Nummern werden ja im Laufe der Zeit höher und nicht geringer...
 
Zuletzt bearbeitet:
Bezugnehmend auf Beitrag #25 von mir habe ich noch eine Anmerkung zu machen...
Selbst Chat GPT sagt: Powershell ist dafür nicht ausreichend, um die Skalierung von größer als 100 Prozent
für mehr als einen Monitor (zwei oder mehr Monitore) exakt darzustellen. Nur die Skalierung des
ersten Monitors kann exakt dargestellt werden.
Da wird dann wohl nur meine Lösung mit der If then Bedingung funktionieren... ebenfalls aus Beitrag #25.
 
Das hier hat Chat GPT
ausgespuckt:
Code:
clear-host
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Runtime.InteropServices
Add-Type @"
using System;
using System.Runtime.InteropServices;

public struct Point {
    public int X;
    public int Y;

    public Point(int x, int y) {
        X = x;
        Y = y;
    }
}

public class DPI {
    [DllImport("user32.dll")]
    public static extern IntPtr MonitorFromPoint(Point pt, uint dwFlags);

    [DllImport("gdi32.dll")]
    public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

    [DllImport("user32.dll")]
    public static extern IntPtr GetDC(IntPtr hwnd);

    public enum DeviceCap {
        VERTRES = 10,
        DESKTOPVERTRES = 117
    }

    public static float GetScalingForMonitor(IntPtr monitorHandle) {
        IntPtr hdc = GetDC(monitorHandle);
        int logicalScreenHeight = GetDeviceCaps(hdc, (int)DeviceCap.VERTRES);
        int physicalScreenHeight = GetDeviceCaps(hdc, (int)DeviceCap.DESKTOPVERTRES);
        return (float)physicalScreenHeight / (float)logicalScreenHeight;
    }
}
"@ -ErrorAction Stop

# Fügen Sie die System.Windows.Forms-Assembly hinzu
Add-Type -AssemblyName System.Windows.Forms

# Liste der Monitore abrufen
$monitors = [System.Windows.Forms.Screen]::AllScreens

# Skalierung für jeden Monitor ermitteln
foreach ($monitor in $monitors) {
    # Punkt in der Mitte des Monitors erstellen
    $x = $monitor.Bounds.X + ($monitor.Bounds.Width / 2)
    $y = $monitor.Bounds.Y + ($monitor.Bounds.Height / 2)
    $point = New-Object -TypeName PSObject -Property @{X=$x; Y=$y}

    # Monitor-Handle abrufen
    $monitorHandle = [DPI]::MonitorFromPoint($point, 0)

    # Skalierung abrufen
    $scaling = [DPI]::GetScalingForMonitor($monitorHandle)

    # Umrechnung in Prozent
    if ($scaling -gt 1) {
        $scaling = [math]::round($scaling * 100, 0)
    } else {
        $scaling = 100
    }

    Write-Host "Monitor: $($monitor.DeviceName) - Skalierung: $scaling%"
}
pause

Problem: beide Werte werden bei mir mit 100 Prozent ausgegeben, obwohl ich zu Testzwecken 125 Prozent
eingestellt habe.
 
Habe gerade im folgenden Forum über das Tool ResolutionChanger gelesen, vielleicht hilft es dir ja dein Problem zu lösen:

Weitere Information:

Und Download:
 
Danke Dir
Ausprobiert habe bzw. hatte ich den auch schon mal.
Aber wie gesagt Chat GPT (ne ÖSI Site) meinte auch, dass:
1. Powershell unzureichend sei für die Bildschirmauflösungsdarstellung des 2. Monitors, wenn dieser skaliert ist.
2. Solche Programme haben das selbe Problem wie auch z.B. die qres.exe
Bei Skalierung des Monitors tun die sich alle schwer den Realwert der Auflösung korrekt bei Skalierung anzuzeigen.
Insbesondere bei dem zweiten oder 3. Monitor (oder mehrere) am / im System!
 
Leider habe ich übersehen, dass es dir ja hauptsächlich um die Anzeige der Skalierung geht, welche der User GeorgeK1ng noch nicht eingepflegt hat, da er sein Tool abwärts kompatible halten möchte.

Teste bitte mal das folgende Tool SetDPI, ob es dir für alle Monitore die eingestellte Skalierung anzeigt:
 
dxdiag.exe gibt auch die Monitoreigenschaften aus. Da müsste man aber die gewünschten Infos aus dem Output herausfiltern.
 
An @JCR ... jepp ist bekannt aber da dauert es auch lange bis man an die Infos rankommt.
Und wie Du ja selbst sagst müsste man da auch noch alles rausfiltern.
Das Tool von @skorpion68 scheint wohl genau das zu sein wo nach ich suche.
Jetzt werde ich das nur noch in Powershell so für den zweiten und (eventuell weitere) Monitor(e)
verwursten, dass bei einer Skalierung des zweiten Monitors der Wert 150 z.B. eben hier mal 1,5 der Auflösung gerundet anzeigt. Das ist ja deshalb so wichtig, da ja z.B. bei einem Notebook-Monitor mit 1366 * 768
Auflösung bei 125 % Skalierung 1366 * 125 ja einen (falschen nicht gerundeten) Wert angibt...
Das Ganze sollte jetzt aber kein größeres Problem mehr sein, da sich ja die setdpi.exe in Powershell zum Auslesen der
Skalierunsgwerte einbinden und der Wert der Skalierung dann weiter verarbeiten lässt.
Beim 1. Monitor geht das ja alles auch ohne die setdpi.exe. Da ist ja auch alles fertig und funzt hundertprozentig.
Danke an @skorpion68 noch mal für Deine Mühe.
Wenn ich das hinbekommen habe mit der Multipliziererrei und dem Aufrunden melde ich mich noch mal mit dem fertigen Skript. Zugegeben... Das Tool kannte ich noch nicht und es ist aberwitzig da es mit 23 kb williwinzig ist.
 
Das mein durch Morbus Waldenström geschwächter Körper das noch erleben darf.
Dank @skorpion68 und der ÖSI-Site Chat GPT funktioniert das Skript jetzt zu 100 Prozent.
Kurze Info noch:
Im Ordner D:\Programme\batch ist bei mir alles drin, was ich so in den letzten Jahren
an Batch, Reg und zuletzt an Powershellkram erstellt habe.
In den Umgebungsvariablen ist der Ordner auch fest in der Registry als weitere Anlaufstelle für ausführbare Programme und Skripte mit verankert.
Deshalb sieht das Powershellskript jetzt so aus:
Code:
clear-host
    $Host.UI.RawUI.WindowTitle = 'Abfrage von Kerndaten, blau-weiss, aufsteigende Updateliste.'
    $Mein_Betriebssystem = (Get-CimInstance Win32_OperatingSystem).Caption
    $Version = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').DisplayVersion
    $Architektur = (Get-CimInstance Win32_operatingsystem).OSArchitecture
    $Buildnummer = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').CurrentBuild
    $Erweiterung = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').UBR
    $Computername = (Get-CimInstance Win32_ComputerSystem).Name
    $Meine_Domaene = (Get-CimInstance Win32_ComputerSystem).Domain
    # $Benutzername = (Get-CimInstance Win32_ComputerSystem).PrimaryOwnerName
    $Benutzername = ($env:UserName)
    $User_ID = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
Add-Type -AssemblyName System.Windows.Forms
$screen_count  = [System.Windows.Forms.Screen]::AllScreens.Count
$col_screens = [system.windows.forms.screen]::AllScreens
$setDpiPath = "D:\Programme\batch\setdpi.exe"
clear-host

# __________________________________________________________Anfang Screen 1____________________________________________________________________________________________________________

$info_screens_1 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type_1_horizontal = $($_.Bounds.Width)}})
$info_screens_1 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type_1_vertical = $($_.Bounds.height)}})

Add-Type @'
using System;
using System.Runtime.InteropServices;
using System.Drawing;

public class DPI {[DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); public enum DeviceCap {VERTRES = 10, DESKTOPVERTRES = 117}

public static float scaling() {Graphics g = Graphics.FromHwnd(IntPtr.Zero); IntPtr desktop = g.GetHdc(); int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); return (float)PhysicalScreenHeight / (float)LogicalScreenHeight;}}
'@ -ReferencedAssemblies 'System.Drawing.dll' -ErrorAction Stop
$First_Monitor_DPI_Scaling = [DPI]::scaling()
if ($First_Monitor_DPI_Scaling -gt 1) {$First_Monitor_DPI_Scaling = [math]::round($First_Monitor_DPI_Scaling,2)} else {$First_Monitor_DPI_Scaling = 1}


if ($First_Monitor_DPI_Scaling -gt 1) {$monitor_type_1_horizontal = $monitor_type_1_horizontal * $First_Monitor_DPI_Scaling}
if ($First_Monitor_DPI_Scaling -gt 1) {$monitor_type_1_vertical = $monitor_type_1_vertical * $First_Monitor_DPI_Scaling}

$monitor_type_1_horizontal=[math]::Round($monitor_type_1_horizontal)
$monitor_type_1_vertical=[math]::Round($monitor_type_1_vertical)

# ___________________________________________________________Ende Screen 1_____________________________________________________________________________________________________________

# __________________________________________________________Anfang Screen 2____________________________________________________________________________________________________________


$info_screens_2 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "False") {$monitor_type_2_horizontal = $($_.Bounds.Width)}})
$info_screens_2 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "False") {$monitor_type_2_vertical = $($_.Bounds.height)}})

if ($screen_count -gt 1) {$second_Monitor_DPI_Scaling = & $setDpiPath get 2 | Out-String}
if ($second_Monitor_DPI_Scaling -match 'current resolution:\s*(\d+)') {$second_Monitor_DPI_Scaling = $matches[1]}
$second_Monitor_DPI_Scaling = ($second_Monitor_DPI_Scaling / 100)

if ($second_Monitor_DPI_Scaling -gt 1) {$second_Monitor_DPI_Scaling = [math]::round($second_Monitor_DPI_Scaling,2)} else {$second_Monitor_DPI_Scaling = 1}


if ($second_Monitor_DPI_Scaling -gt 1) {$monitor_type_2_horizontal = $monitor_type_2_horizontal * $second_Monitor_DPI_Scaling}
if ($second_Monitor_DPI_Scaling -gt 1) {$monitor_type_2_vertical = $monitor_type_2_vertical * $second_Monitor_DPI_Scaling}

$monitor_type_2_horizontal=[math]::Round($monitor_type_2_horizontal)
$monitor_type_2_vertical=[math]::Round($monitor_type_2_vertical)

# ___________________________________________________________Ende Screen 2_____________________________________________________________________________________________________________
clear-host

$esc = [char]27

Write-Host ('
Die wichtigsten Kerndaten dieses Systems werden hier mit Powershell angezeigt.')
Write-Host
Write-Host Auf Ihrem Coumputer ist $Mein_Betriebssystem, Version $Version als $Architektur Betriebssystem installiert.
Write-Host
Write-Host Die momentane Buildnummer lautet $Buildnummer'.'$Erweiterung'.'
Write-Host
Write-Host Der Name dieses Computers lautet $Computername'.'
Write-Host
Write-Host Der Name der Arbeitsgruppe lautet $Meine_Domaene'.'
Write-Host
Write-Host Die User-ID des momentan angemeldeten Benutzers $Benutzername lautet $User_ID'.'
if ($screen_count -eq 1) {write-host "Die primäre Anzeige hat eine Auflösung von $monitor_type_1_horizontal Bildpunkten horizontal und $monitor_type_1_vertical Bildpunkten vertikal."}
if ($screen_count -eq 1) {write-host "Die primäre Anzeige hat einen Skalierungsfaktor von $First_Monitor_DPI_Scaling."}
if ($screen_count -gt 1) {write-host "Die primäre   Anzeige hat eine Auflösung von $monitor_type_1_horizontal Bildpunkten horizontal und $monitor_type_1_vertical Bildpunkten vertikal."}
if ($screen_count -gt 1) {write-host "Die primäre   Anzeige hat einen Skalierungsfaktor von $First_Monitor_DPI_Scaling."}
if ($screen_count -gt 1) {write-host "Die sekundäre Anzeige hat eine Auflösung von $monitor_type_2_horizontal Bildpunkten horizontal und $monitor_type_2_vertical Bildpunkten vertikal."}
if ($screen_count -gt 1) {write-host "Die sekundäre Anzeige hat einen Skalierungsfaktor von $second_Monitor_DPI_Scaling."}
Write-Host Hier werden Ihnen nur die zuletzt installierten Windows Updates angezeigt. Die Sortierreihenfolge ist aufsteigend
write-host "und richtet sich nach den HotFix-ID´s. Darunter fallen jedoch nicht Treiber, Office oder unter WSUS empfangene Updates."
Write-Host WSUS steht für Windows Server Update Services. Die Server sind von Microsoft.
Write-Host `n'   Installiert am   HotFix-ID Beschreibung          (Eine genaue Uhrzeitauflösung ist nicht möglich).'
Write-Host -----------------------------------------------------------------------------------------------------
Get-HotFix | Select-Object -Property Installedon, HotFixID, Description | Sort-Object -Property InstalledOn | Format-Table -HideTableHeaders
# Get-HotFix | Select-Object -Property HotFixID, Description, @{Name='InstalledOn'; Expression={($_.InstalledOn).ToString('dd.MM.yyyy')}} | Sort-Object -Property HotFixID | Format-Table -HideTableHeaders
Write-Host 'Zum Beenden drücken Sie eine beliebige Taste . . . '-NoNewLine;[void]($Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'));Write-Host
D:\Programme\batch\Info_Center_Settings.bat
exit
Wer das Ganze ausprobieren will, muss halt nur den Pfad zur setdpi.exe abändern und die Zeile
(den Pfad) D:\Programme\batch\Info_Center_Settings.bat löschen oder mit rem von der Ausführung ausklammern.

Habe es gerade noch mal verfeinert, da eine Fehlermeldung kam, wenn kein zweiter Monitor angeschlossen ist.

Diese Zeile hier meine ich:
Code:
if ($screen_count -gt 1) {$second_Monitor_DPI_Scaling = & $setDpiPath get 2 | Out-String}
Erklärung:
Nur wenn mehr als ein Monitor angeschlossen ist, führe die setdpi.exe aus.
 
Zuletzt bearbeitet:
So ist es natürlich noch hübscher:
Code:
clear-host
    $Host.UI.RawUI.WindowTitle = 'Abfrage von Kerndaten, blau-weiss, aufsteigende Updateliste.'
    $Mein_Betriebssystem = (Get-CimInstance Win32_OperatingSystem).Caption
    $Version = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').DisplayVersion
    $Architektur = (Get-CimInstance Win32_operatingsystem).OSArchitecture
    $Buildnummer = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').CurrentBuild
    $Erweiterung = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').UBR
    $Computername = (Get-CimInstance Win32_ComputerSystem).Name
    $Meine_Domaene = (Get-CimInstance Win32_ComputerSystem).Domain
    # $Benutzername = (Get-CimInstance Win32_ComputerSystem).PrimaryOwnerName
    $Benutzername = ($env:UserName)
    $User_ID = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
Add-Type -AssemblyName System.Windows.Forms
$screen_count  = [System.Windows.Forms.Screen]::AllScreens.Count
$col_screens = [system.windows.forms.screen]::AllScreens
$setDpiPath = "D:\Programme\batch\setdpi.exe"
clear-host

# __________________________________________________________Anfang Screen 1____________________________________________________________________________________________________________

$info_screens_1 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type_1_horizontal = $($_.Bounds.Width)}})
$info_screens_1 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type_1_vertical = $($_.Bounds.height)}})

Add-Type @'
using System;
using System.Runtime.InteropServices;
using System.Drawing;

public class DPI {[DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); public enum DeviceCap {VERTRES = 10, DESKTOPVERTRES = 117}

public static float scaling() {Graphics g = Graphics.FromHwnd(IntPtr.Zero); IntPtr desktop = g.GetHdc(); int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); return (float)PhysicalScreenHeight / (float)LogicalScreenHeight;}}
'@ -ReferencedAssemblies 'System.Drawing.dll' -ErrorAction Stop
$First_Monitor_DPI_Scaling = [DPI]::scaling()
if ($First_Monitor_DPI_Scaling -gt 1) {$First_Monitor_DPI_Scaling = [math]::round($First_Monitor_DPI_Scaling,2)} else {$First_Monitor_DPI_Scaling = 1}
$First_Monitor_DPI_Scaling_prozent = ($first_Monitor_DPI_Scaling * 100)


if ($First_Monitor_DPI_Scaling -gt 1) {$monitor_type_1_horizontal = $monitor_type_1_horizontal * $First_Monitor_DPI_Scaling}
if ($First_Monitor_DPI_Scaling -gt 1) {$monitor_type_1_vertical = $monitor_type_1_vertical * $First_Monitor_DPI_Scaling}

$monitor_type_1_horizontal=[math]::Round($monitor_type_1_horizontal)
if ($first_Monitor_DPI_Scaling -eq 1.75 -and $monitor_type_1_horizontal -gt 4093) {($monitor_type_1_horizontal = $monitor_type_1_horizontal - 1)}
if ($first_Monitor_DPI_Scaling -gt 2.24 -and $monitor_type_1_horizontal -gt 4093) {($monitor_type_1_horizontal = $monitor_type_1_horizontal + 1)}
if ($first_Monitor_DPI_Scaling -eq 1.75 -and $monitor_type_1_horizontal -gt 8189) {($monitor_type_1_horizontal = $monitor_type_1_horizontal - 1)}
if ($first_Monitor_DPI_Scaling -gt 2.24 -and $monitor_type_1_horizontal -gt 8189) {($monitor_type_1_horizontal = $monitor_type_1_horizontal + 1)}

$monitor_type_1_vertical=[math]::Round($monitor_type_1_vertical)

# ___________________________________________________________Ende Screen 1_____________________________________________________________________________________________________________

# __________________________________________________________Anfang Screen 2____________________________________________________________________________________________________________


$info_screens_2 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "False") {$monitor_type_2_horizontal = $($_.Bounds.Width)}})
$info_screens_2 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "False") {$monitor_type_2_vertical = $($_.Bounds.height)}})

if ($screen_count -gt 1) {$second_Monitor_DPI_Scaling = & $setDpiPath get 2 | Out-String}
if ($second_Monitor_DPI_Scaling -match 'current resolution:\s*(\d+)') {$second_Monitor_DPI_Scaling = $matches[1]}
$second_Monitor_DPI_Scaling = ($second_Monitor_DPI_Scaling / 100)

if ($second_Monitor_DPI_Scaling -gt 1) {$second_Monitor_DPI_Scaling = [math]::round($second_Monitor_DPI_Scaling,2)} else {$second_Monitor_DPI_Scaling = 1}

$second_Monitor_DPI_Scaling_prozent = ($second_Monitor_DPI_Scaling * 100)

if ($second_Monitor_DPI_Scaling -gt 1) {$monitor_type_2_horizontal = $monitor_type_2_horizontal * $second_Monitor_DPI_Scaling}
if ($second_Monitor_DPI_Scaling -gt 1) {$monitor_type_2_vertical = $monitor_type_2_vertical * $second_Monitor_DPI_Scaling}

$monitor_type_2_horizontal=[math]::Round($monitor_type_2_horizontal)
if ($second_Monitor_DPI_Scaling -eq 1.75 -and $monitor_type_2_horizontal -gt 4093) {($monitor_type_2_horizontal = $monitor_type_2_horizontal - 1)}
if ($second_Monitor_DPI_Scaling -gt 2.24 -and $monitor_type_2_horizontal -gt 4093) {($monitor_type_2_horizontal = $monitor_type_2_horizontal + 1)}
if ($second_Monitor_DPI_Scaling -eq 1.75 -and $monitor_type_2_horizontal -gt 8189) {($monitor_type_2_horizontal = $monitor_type_2_horizontal - 1)}
if ($second_Monitor_DPI_Scaling -gt 2.24 -and $monitor_type_2_horizontal -gt 8189) {($monitor_type_2_horizontal = $monitor_type_2_horizontal + 1)}
$monitor_type_2_vertical=[math]::Round($monitor_type_2_vertical)

# ___________________________________________________________Ende Screen 2_____________________________________________________________________________________________________________

clear-host

$esc = [char]27

Write-Host ('
Die wichtigsten Kerndaten dieses Systems werden hier mit Powershell angezeigt.')
Write-Host
Write-Host Auf Ihrem Coumputer ist $Mein_Betriebssystem, Version $Version als $Architektur Betriebssystem installiert.
Write-Host
Write-Host Die momentane Buildnummer lautet $Buildnummer'.'$Erweiterung'.'
Write-Host
Write-Host Der Name dieses Computers lautet $Computername'.'
Write-Host
Write-Host Der Name der Arbeitsgruppe lautet $Meine_Domaene'.'
Write-Host
Write-Host Die User-ID des momentan angemeldeten Benutzers $Benutzername lautet $User_ID'.'
if ($screen_count -eq 1) {write-host "Die primäre Anzeige hat eine Auflösung von $monitor_type_1_horizontal Bildpunkten horizontal und $monitor_type_1_vertical Bildpunkten vertikal."}
if ($screen_count -eq 1) {write-host "Die primäre Anzeige hat einen Skalierungsfaktor von $First_Monitor_DPI_Scaling_prozent Prozent."}
if ($screen_count -gt 1) {write-host "Die primäre   Anzeige hat eine Auflösung von $monitor_type_1_horizontal Bildpunkten horizontal und $monitor_type_1_vertical Bildpunkten vertikal."}
if ($screen_count -gt 1) {write-host "Die primäre   Anzeige hat einen Skalierungsfaktor von $First_Monitor_DPI_Scaling_prozent Prozent."}
if ($screen_count -gt 1) {write-host "Die sekundäre Anzeige hat eine Auflösung von $monitor_type_2_horizontal Bildpunkten horizontal und $monitor_type_2_vertical Bildpunkten vertikal."}
if ($screen_count -gt 1) {write-host "Die sekundäre Anzeige hat einen Skalierungsfaktor von $second_Monitor_DPI_Scaling_prozent Prozent."}
Write-Host Hier werden Ihnen nur die zuletzt installierten Windows Updates angezeigt. Die Sortierreihenfolge ist aufsteigend
write-host "und richtet sich nach den HotFix-ID´s. Darunter fallen jedoch nicht Treiber, Office oder unter WSUS empfangene Updates."
Write-Host WSUS steht für Windows Server Update Services. Die Server sind von Microsoft.
Write-Host `n'   Installiert am   HotFix-ID Beschreibung          (Eine genaue Uhrzeitauflösung ist nicht möglich).'
Write-Host -----------------------------------------------------------------------------------------------------
Get-HotFix | Select-Object -Property Installedon, HotFixID, Description | Sort-Object -Property InstalledOn | Format-Table -HideTableHeaders
# Get-HotFix | Select-Object -Property HotFixID, Description, @{Name='InstalledOn'; Expression={($_.InstalledOn).ToString('dd.MM.yyyy')}} | Sort-Object -Property HotFixID | Format-Table -HideTableHeaders
Write-Host 'Zum Beenden drücken Sie eine beliebige Taste . . . '-NoNewLine;[void]($Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'));Write-Host
D:\Programme\batch\Info_Center_Settings.bat
exit
Bei den Zeilen :
Code:
if ($first_Monitor_DPI_Scaling -eq 1.75 -and $monitor_type_1_horizontal -gt 4093) {($monitor_type_1_horizontal = $monitor_type_1_horizontal - 1)}
muss ich mir noch was einfallen lassen. Durch das Auf bzw. Abrunden der Werte werden bei einer Auflösung von
4096 Bildpunkten horizontal mit dem Wert 4097 wiedergegeben, wenn die Skalierung 175 Prozent beträgt..
Bei einer noch höheren Skalierung (über 225 Prozent) muss dann der Weert mit + 1 wiedergegeben werden.
Deshalb wurde ja auch das Auf und Abrunden der Werte eingeführt,
damit nicht bei 1366 Bildpunkten 1366,25 Bildpunkte angezeigt werden.
 
Zuletzt bearbeitet:
Eine Sache habe ich noch rausgefunden.
setdpi.exe kann auch nur den Wert der Skalierung ohne Formatierung angeben.
setdpi.exe value 2 zeigt dann nur den Wert der Skalierung an.
Beispiel hier: Der Wert der Skalierung des zweiten Monitors.
Das erleichtert das Powershellskript ein wenig.
Code:
clear-host
    $Host.UI.RawUI.WindowTitle = 'Abfrage von Kerndaten, blau-weiss, aufsteigende Updateliste.'
    $Mein_Betriebssystem = (Get-CimInstance Win32_OperatingSystem).Caption
    $Version = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').DisplayVersion
    $Architektur = (Get-CimInstance Win32_operatingsystem).OSArchitecture
    $Buildnummer = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').CurrentBuild
    $Erweiterung = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').UBR
    $Computername = (Get-CimInstance Win32_ComputerSystem).Name
    $Meine_Domaene = (Get-CimInstance Win32_ComputerSystem).Domain
    # $Benutzername = (Get-CimInstance Win32_ComputerSystem).PrimaryOwnerName
    $Benutzername = ($env:UserName)
    $User_ID = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
Add-Type -AssemblyName System.Windows.Forms
$screen_count  = [System.Windows.Forms.Screen]::AllScreens.Count
$col_screens = [system.windows.forms.screen]::AllScreens
$setDpiPath = "D:\Programme\batch\setdpi.exe"
clear-host

# __________________________________________________________Anfang Screen 1____________________________________________________________________________________________________________

$info_screens_1 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type_1_horizontal = $($_.Bounds.Width)}})
$info_screens_1 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "True") {$monitor_type_1_vertical = $($_.Bounds.height)}})

Add-Type @'
using System;
using System.Runtime.InteropServices;
using System.Drawing;

public class DPI {[DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); public enum DeviceCap {VERTRES = 10, DESKTOPVERTRES = 117}

public static float scaling() {Graphics g = Graphics.FromHwnd(IntPtr.Zero); IntPtr desktop = g.GetHdc(); int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); return (float)PhysicalScreenHeight / (float)LogicalScreenHeight;}}
'@ -ReferencedAssemblies 'System.Drawing.dll' -ErrorAction Stop
$First_Monitor_DPI_Scaling = [DPI]::scaling()
if ($First_Monitor_DPI_Scaling -gt 1) {$First_Monitor_DPI_Scaling = [math]::round($First_Monitor_DPI_Scaling,2)} else {$First_Monitor_DPI_Scaling = 1}
$First_Monitor_DPI_Scaling_prozent = ($first_Monitor_DPI_Scaling * 100)


if ($First_Monitor_DPI_Scaling -gt 1) {$monitor_type_1_horizontal = $monitor_type_1_horizontal * $First_Monitor_DPI_Scaling}
if ($First_Monitor_DPI_Scaling -gt 1) {$monitor_type_1_vertical = $monitor_type_1_vertical * $First_Monitor_DPI_Scaling}

$monitor_type_1_horizontal=[math]::Round($monitor_type_1_horizontal)
if ($first_Monitor_DPI_Scaling -eq 1.75 -and $monitor_type_1_horizontal -gt 4093) {($monitor_type_1_horizontal = $monitor_type_1_horizontal - 1)}
if ($first_Monitor_DPI_Scaling -gt 2.24 -and $monitor_type_1_horizontal -gt 4093) {($monitor_type_1_horizontal = $monitor_type_1_horizontal + 1)}
if ($first_Monitor_DPI_Scaling -eq 1.75 -and $monitor_type_1_horizontal -gt 8189) {($monitor_type_1_horizontal = $monitor_type_1_horizontal - 1)}
if ($first_Monitor_DPI_Scaling -gt 2.24 -and $monitor_type_1_horizontal -gt 8189) {($monitor_type_1_horizontal = $monitor_type_1_horizontal + 1)}

$monitor_type_1_vertical=[math]::Round($monitor_type_1_vertical)

# ___________________________________________________________Ende Screen 1_____________________________________________________________________________________________________________

# __________________________________________________________Anfang Screen 2____________________________________________________________________________________________________________


$info_screens_2 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "False") {$monitor_type_2_horizontal = $($_.Bounds.Width)}})
$info_screens_2 = ($col_screens | ForEach-Object {if ("$($_.Primary)" -eq "False") {$monitor_type_2_vertical = $($_.Bounds.height)}})

if ($screen_count -gt 1) {$second_Monitor_DPI_Scaling_prozent = & $setDpiPath value 2 | Out-String}
$second_Monitor_DPI_Scaling = ($second_Monitor_DPI_Scaling_prozent / 100)

if ($second_Monitor_DPI_Scaling -gt 1) {$second_Monitor_DPI_Scaling = [math]::round($second_Monitor_DPI_Scaling,2)} else {$second_Monitor_DPI_Scaling = 1}

if ($second_Monitor_DPI_Scaling -gt 1) {$monitor_type_2_horizontal = $monitor_type_2_horizontal * $second_Monitor_DPI_Scaling}
if ($second_Monitor_DPI_Scaling -gt 1) {$monitor_type_2_vertical = $monitor_type_2_vertical * $second_Monitor_DPI_Scaling}

$monitor_type_2_horizontal=[math]::Round($monitor_type_2_horizontal)
if ($second_Monitor_DPI_Scaling -eq 1.75 -and $monitor_type_2_horizontal -gt 4093) {($monitor_type_2_horizontal = $monitor_type_2_horizontal - 1)}
if ($second_Monitor_DPI_Scaling -gt 2.24 -and $monitor_type_2_horizontal -gt 4093) {($monitor_type_2_horizontal = $monitor_type_2_horizontal + 1)}
if ($second_Monitor_DPI_Scaling -eq 1.75 -and $monitor_type_2_horizontal -gt 8189) {($monitor_type_2_horizontal = $monitor_type_2_horizontal - 1)}
if ($second_Monitor_DPI_Scaling -gt 2.24 -and $monitor_type_2_horizontal -gt 8189) {($monitor_type_2_horizontal = $monitor_type_2_horizontal + 1)}
$monitor_type_2_vertical=[math]::Round($monitor_type_2_vertical)

# ___________________________________________________________Ende Screen 2_____________________________________________________________________________________________________________

clear-host

$esc = [char]27

Write-Host ('
Die wichtigsten Kerndaten dieses Systems werden hier mit Powershell angezeigt.')
Write-Host
Write-Host Auf Ihrem Coumputer ist $Mein_Betriebssystem, Version $Version als $Architektur Betriebssystem installiert.
Write-Host
Write-Host Die momentane Buildnummer lautet $Buildnummer'.'$Erweiterung'.'
Write-Host
Write-Host Der Name dieses Computers lautet $Computername'.'
Write-Host
Write-Host Der Name der Arbeitsgruppe lautet $Meine_Domaene'.'
Write-Host
Write-Host Die User-ID des momentan angemeldeten Benutzers $Benutzername lautet $User_ID'.'
if ($screen_count -eq 1) {write-host "Die primäre Anzeige hat eine Auflösung von $monitor_type_1_horizontal Bildpunkten horizontal und $monitor_type_1_vertical Bildpunkten vertikal."}
if ($screen_count -eq 1) {write-host "Die primäre Anzeige hat einen Skalierungsfaktor von $First_Monitor_DPI_Scaling_prozent Prozent."}
if ($screen_count -gt 1) {write-host "Die primäre   Anzeige hat eine Auflösung von $monitor_type_1_horizontal Bildpunkten horizontal und $monitor_type_1_vertical Bildpunkten vertikal."}
if ($screen_count -gt 1) {write-host "Die primäre   Anzeige hat einen Skalierungsfaktor von $First_Monitor_DPI_Scaling_prozent Prozent."}
if ($screen_count -gt 1) {write-host "Die sekundäre Anzeige hat eine Auflösung von $monitor_type_2_horizontal Bildpunkten horizontal und $monitor_type_2_vertical Bildpunkten vertikal."}
if ($screen_count -gt 1) {write-host "Die sekundäre Anzeige hat einen Skalierungsfaktor von $second_Monitor_DPI_Scaling_prozent Prozent."}
Write-Host Hier werden Ihnen nur die zuletzt installierten Windows Updates angezeigt. Die Sortierreihenfolge ist aufsteigend
write-host "und richtet sich nach den HotFix-ID´s. Darunter fallen jedoch nicht Treiber, Office oder unter WSUS empfangene Updates."
Write-Host WSUS steht für Windows Server Update Services. Die Server sind von Microsoft.
Write-Host `n'   Installiert am   HotFix-ID Beschreibung          (Eine genaue Uhrzeitauflösung ist nicht möglich).'
Write-Host -----------------------------------------------------------------------------------------------------
Get-HotFix | Select-Object -Property Installedon, HotFixID, Description | Sort-Object -Property InstalledOn | Format-Table -HideTableHeaders
# Get-HotFix | Select-Object -Property HotFixID, Description, @{Name='InstalledOn'; Expression={($_.InstalledOn).ToString('dd.MM.yyyy')}} | Sort-Object -Property HotFixID | Format-Table -HideTableHeaders
Write-Host 'Zum Beenden drücken Sie eine beliebige Taste . . . '-NoNewLine;[void]($Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'));Write-Host
D:\Programme\batch\Info_Center_Settings.bat
exit

Wenn man die Monitordaten mit dem -outfile Befehl jetzt noch alle in eine Text-Datei exportiert, kann man die sogar in eine Batch-Datei einlesen und dort auch in einem DOS-Skript anzeigen lassen.
Daran arbeite ich aber gerade noch.
Vielleicht geht das ja sogar mit der gesamten Textausgabe des Skripts?
 
Tja
Wer denn mal ein bisschen rumexperimentieren will, für Den gibt es im Anhang eine Zip-Datei
mit Powershell-Skripten und DOS-Skripten.
Bitte immer folgendes beachten.
1. Das Ganze ist nichts für Laien.
2. Benutzung auf eigene Gefahr.
3. Administrative Rechte sind erforderlich.
4. Die Pfade in den Dateien sind alle auf D:\Programme\batch eingestellt und müssen angepasst werden.
5. Wenn Abfragen über das veraltete WMIC erfolgen und WMIC nicht installiert ist,
kann es zu Fehlermeldungen kommen.
6. Programmierfehler und Unzulänglichkeiten sind Eigentum von mich!
7. Meckern könnt Ihr darüber bei Euch zuhause.
8. Ich habe ferdisch.
 

Anhänge

  • Powershell_und_DOS_Test-Dateien_Pfade_müssen_angepasst_werden.zip
    97,9 KB · Aufrufe: 14
Chat GPT die ÖSI-Site hat mir in den letzten zwei Tagen (und Nächten) echt weiter geholfen.

Die Powershellskripte wurden nochmals von der KI optimiert und funktionieren jetzt zumindest
bei meinen Monitoren wenn, man denn Folgendes berücksichtigt:

Die Auswertung Ihrer Bildschirmauflösung kann fehlerhaft sein, wenn eine nicht empfohlene und
benutzerdefinierte Skalierung eingestellt wird und Sie sich dann vom Betriebssystem abmelden müssen,
damit die gemachten Änderungen überhaupt erst wirksam werden.
Dieser Fehler tritt insbesondere bei mehr als einem angeschlossenen Monitor auf.

Dies war die Aussage im Anhang von Chat GPT bzw. der KI!

Und es stimmt...
Wählt man eine benutzerdefinierte Skalierung aus, die dann zumindest einer der Monitore zwar kann, meldet sich dann vom System ab und wieder an, dann stimmen die angezeigten Werte der Auflösungen
der einzelenen Monitore teilweise nicht mehr.
Dies kommt u. A. durch die einzelen Einträge "per Monitor" im Abschnitt in der Registry HKCU\....\Desktop.

Wer denn mal trotzdem ein bisschen rumexperimentieren will, für Den gibt es im Anhang eine Zip-Datei
mit Powershell-Skripten und DOS-Skripten.
Bitte immer folgendes beachten.
1. Das Ganze ist nichts für Laien.
2. Benutzung auf eigene Gefahr.
3. Administrative Rechte sind erforderlich.
4. Die Pfade in den Dateien sind alle auf D:\Programme\batch eingestellt und müssen angepasst werden.
5. Wenn Abfragen über das veraltete WMIC erfolgen und WMIC nicht installiert ist,
kann es zu Fehlermeldungen kommen.
6. Programmierfehler und Unzulänglichkeiten sind Eigentum von mich!
7. Meckern könnt Ihr darüber bei Euch zuhause.
8. Ich habe ferdisch.
 

Anhänge

  • Powershell_und_DOS_Test-Dateien_Pfade_müssen_angepasst_werden.zip
    947,3 KB · Aufrufe: 14
Zuletzt bearbeitet:
Ein paar kleinere Verbesserungen hat mir die KI Site aus ÖSI-Land mit bis gerade um 21.35 h noch mitgegeben.
Ich habe da nochmals was vorbereitet.
Aus Beitrag #38 bzw. #39 haben die erwähnten 8 Punkte weiterhin Bestand.
Die wichtigste Voraussetzung ist und bleibt, dass der Pfad D:\Programme\batch entweder angepasst werden muss
oder man stellt sich die Systemumgebung genau so ein!
 

Anhänge

  • Powershell_und_DOS_Test-Dateien_Pfade_müssen_angepasst_werden.zip
    948,8 KB · Aufrufe: 13
Anzeige
Oben