Udostępnij za pośrednictwem


Zadania usługi WMI: Zarządzanie pulpitem

Zadania WMI do zarządzania pulpitem mogą wywierać kontrolę i uzyskiwać dane z pulpitu zdalnego lub komputera lokalnego. Można na przykład określić, czy wygaszacz ekranu na komputerze lokalnym wymaga hasła. Usługa WMI umożliwia również wyłączenie komputera zdalnego. Inne przykłady można znaleźć w witrynie TechNet ScriptCenter pod adresem https://www.microsoft.com/technet.

Przykłady skryptów pokazane w tym temacie uzyskują dane tylko z komputera lokalnego. Aby uzyskać więcej informacji o sposobie uzyskiwania danych z komputerów zdalnych za pomocą skryptu, zobacz Connecting to WMI on a Remote Computer.

Poniższa procedura opisuje sposób uruchamiania skryptu.

Aby uruchomić skryptu

  1. Skopiuj kod i zapisz go w pliku z rozszerzeniem vbs, takim jak nazwa pliku.vbs. Upewnij się, że edytor tekstów nie dodaje rozszerzenia .txt do pliku.
  2. Otwórz okno wiersza polecenia i przejdź do katalogu, w którym zapisano plik.
  3. Wpisz cscript nazwa pliku.vbs w wierszu polecenia.
  4. Jeśli nie możesz uzyskać dostępu do dziennika zdarzeń, sprawdź, czy korzystasz z wiersza polecenia z podwyższonym poziomem uprawnień. Niektóre dzienniki zdarzeń, takie jak dziennik zdarzeń zabezpieczeń, mogą być chronione przez kontrolę dostępu użytkowników (UAC).

Nuta

Domyślnie skrypt cscript wyświetla dane wyjściowe skryptu w oknie wiersza polecenia. Ponieważ skrypty usługi WMI mogą generować duże ilości danych wyjściowych, może być konieczne przekierowanie danych wyjściowych do pliku. Wpisz cscript filename.vbs > outfile.txt w wierszu polecenia, aby przekierować dane wyjściowe pliku pliku.vbs skryptu, aby outfile.txt.

W poniższej tabeli wymieniono przykłady skryptów, których można użyć do uzyskania różnych typów danych z komputera lokalnego.

Jak mogę... Klasy lub metody WMI
... czy komputer zdalny został uruchomiony w trybie awaryjnym ze stanem sieć? Użyj klasy Win32_ComputerSystem i sprawdź wartość właściwości PrimaryOwnerName.
VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSettings = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objComputer in colSettings 
    Wscript.Echo "System Name: " & objComputer.Name
    Wscript.Echo "Registered owner: " & objComputer.PrimaryOwnerName
Next
PowerShell
$colSettings = Get-WmiObject -Class Win32_ComputerSystem
foreach ($objComputer in $colSettings)
{
    "System Name: " + $objComputer.Name
    "Registered owner: " + $objComputer.PrimaryOwnerName
}
... czy wygaszacz ekranu komputera wymaga hasła?

Użyj klasy Win32_Desktop i sprawdź wartość właściwości ScreenSaverSecure.

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Desktop")
For Each objItem in colItems
    Wscript.Echo "Screen Saver Secure: " & objItem.ScreenSaverSecure
Next
PowerShell
$Computer = "."
$Desktops = Get-WMIObject -class Win32_Desktop -ComputerName $computer
"{0} desktops found as follows" -f $desktops.count
foreach ($desktop in $desktops) {
     "Desktop      : {0}"  -f $Desktop.Name
     "Screen Saver : {0}"  -f $desktop.ScreensaverExecutable
     "Secure       : {0} " -f $desktop.ScreenSaverSecure
     ""
}
... czy na ekranie komputera ustawiono 800 pikseli na 600 pikseli?

Użyj klasy Win32_DesktopMonitor i sprawdź wartości właściwości ScreenHeight i ScreenWidth.

VB
strComputer = "."
Set objWMIService = GetObject(_
    "winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_DesktopMonitor")
For Each objItem in colItems
    Wscript.Echo "Screen Height: " & objItem.ScreenHeight
    Wscript.Echo "Screen Width: " & objItem.ScreenWidth
Next

PowerShell
              
              <# Get desktop information #>
$computer = "." $desktops = Get-WmiObject -Class Win32_DesktopMonitor $hostname = nazwa hosta 

<# Wyświetl szczegóły pulpitu #> "Na {1} są {0} pulpity w następujący sposób:" -f $desktops. Count, $hostname "" $i=1 # liczba komputerów stacjonarnych w tym systemie

foreach ($desktop in $desktops) { "Desktop {0}: {1}" -f $i++, $Desktop.Caption "Screen Height : {0}" -f $desktop.ScreenHeight "Screen Width : {0}" -f $desktop.ScreenWidth "" }

... określ, jak długo komputer jest uruchomiony?

Użyj klasy Win32_OperatingSystem i właściwości LastBootUpTime. Odejmowanie tej wartości z bieżącego czasu w celu uzyskania czasu działania systemu.

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
 
For Each objOS in colOperatingSystems
    dtmBootup = objOS.LastBootUpTime
    dtmLastBootUpTime = WMIDateStringToDate(dtmBootup)
    dtmSystemUptime = DateDiff("h", dtmLastBootUpTime, Now)
    Wscript.Echo dtmSystemUptime 
Next
 
Function WMIDateStringToDate(dtmBootup)
    WMIDateStringToDate =  CDate(Mid(dtmBootup, 5, 2) & "/" & _
        Mid(dtmBootup, 7, 2) & "/" & Left(dtmBootup, 4) & " " & Mid (dtmBootup, 9, 2) & ":" & _
        Mid(dtmBootup, 11, 2) & ":" & Mid(dtmBootup, 13, 2))
End Function

PowerShell
              
              , funkcja WMIDateStringToDate($Bootup) { [System.Management.ManagementDateTimeconverter]::ToDateTime($Bootup) } 

<# Skrypt główny #> $Computer = "." # dostosuj zgodnie z potrzebami $computers = Get-WMIObject -class Win32_OperatingSystem -computer $computer

foreach ($system in $computers) { $Bootup = $system.LastBootUpTime $LastBootUpTime = WMIDateStringToDate($Bootup) $now = Get-Date $Uptime = $now-$lastBootUpTime "System Up for: {0}" -f $UpTime }

... czy wyłączyć komputer zdalny?

Użyj klasy Win32_OperatingSystem i metody Win32Shutdown. Podczas nawiązywania połączenia z usługą WMI należy uwzględnić uprawnienie RemoteShutdown. Aby uzyskać więcej informacji, zobacz wykonywanie operacji uprzywilejowanych przy użyciu języka VBScript. W przeciwieństwie do metody Shutdown w Win32_OperatingSystemmetoda Win32Shutdown umożliwia ustawienie flag w celu kontrolowania zachowania zamknięcia.

VB
strComputer = "atl-dc-01"
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate,(Shutdown)}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
    ObjOperatingSystem.Shutdown(1)
Next
PowerShell
strComputer = "atl-dc-01"
$colOperatingSystem = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $strComputer -Namespace "wmi\cimv2"
foreach ($objOperatingSystem in $colOperatingSystem)
{
    [void]$objOperatingSystem.Shutdown()
}
... określić, które aplikacje są uruchamiane automatycznie za każdym razem, gdy uruchamiam system Windows?

Użyj klasy Win32_StartupCommand.

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colStartupCommands = objWMIService.ExecQuery _
    ("Select * from Win32_StartupCommand")
For Each objStartupCommand in colStartupCommands
    Wscript.Echo "Command: " & objStartupCommand.Command & VBNewLine _
    & "Description: " & objStartupCommand.Description & VBNewLine _
    & "Location: " & objStartupCommand.Location & VBNewLine _
    & "Name: " & objStartupCommand.Name & VBNewLine _
    & "SettingID: " & objStartupCommand.SettingID & VBNewLine _
    & "User: " & objStartupCommand.User
Next
PowerShell
$strComputer = "."
$colItems = Get-WmiObject -Class Win32_StartupCommand -ComputerName $strComputer
foreach ($objStartupCommand in $colItems) 
{ 
    "Command: " + $objStartupCommand.Command
    "Description: " + $objStartupCommand.Description 
    "Location: " + $objStartupCommand.Location 
    "Name: " + $objStartupCommand.Name 
    "SettingID: " + $objStartupCommand.SettingID 
    "User: " + $objStartupCommand.User
}

zadania usługi WMI dla skryptów i aplikacji

przykłady aplikacji WMI C++

TechNet ScriptCenter