Powershell время включения компьютера
На сегодняшний день PowerShell Remoting является основным инструментом удаленного управления операционными системами Windows. Поэтому, знать о его возможностях и использовать в своих повседневных задачах должен каждый системный администратор Windows. Для запуска команд на удаленных компьютерах с помощью PowerShell Remoting, можно использовать командлет Powershell Invoke-Command (псевдоним icm).
Для удаленного подключения к компьютеру через PowerShell Remoting на нем необходимо выполнить ряд настроек:
- Нужно разрешить удаленные подключения: Enable-PSRemoting -Force
- Запустить службу WinRM: Start-Service WinRM
- Создать правило Брандмауэра Windows, разрешающее входящие подключения по этому протоколу.
Компьютер, с которого планируется удаленно управлять другими компьютерами/серверами через PowerShell Remoting также нужно донастроить:
- Необходимо разрешить подключения к удаленным системам. Для предоставления доступа ко всем удаленным компьютерам, воспользуйтесь командой: Set-Item wsman:\localhost\client\trustedhosts * -Force
- Убедитесь, что файервол не блокирует исходящие подключения.
Теперь, чтобы выполнить команду на удаленном компьютере через Powershell Remoting (например, вы хотите перезапустить службу печати Spooler), вам нужно выполнить такую команду:
Invoke-Command -computername server1 -credential domain\user1 -scriptblock
Эта команда выполняет команду Restart-Service spooler на удаленном компьютере с именем server1. Параметр Credential используется для выполнения команды в контексте безопасности доменного пользователя domain\user1.
При указании имени пользователя, Windows PowerShell отобразит диалоговое окно, в котором нужно указать пароль учетной записи user1. Затем указанная в фигурных скобках команда выполняется на удаленном компьютере и возвращает результаты в консоль. После выполнения команды удаленный сеанс PoSh завершается.
Чтобы запустить задачу в фоновом режиме, вы можете указать параметр -AsJob .
При запуске команды в фоновом режиме PowerShell не возвращает ее результаты. Чтобы получить их, нужно использовать командлет Receive-Job.
Get-job –id 3 |Receive-Job
Для запуска не одной команды, а целого скрипта PowerShell, командлет Invoke-Command имеет специальный аргумент -FilePath, который нужно использовать вместо -ScriptBlock для указания пути к файлу скрипта. Например, я создал небольшой скрипт PoSh, который отображает список остановленных служб. Выполним данный скрипт на удаленном компьютере:
Invoke-Command -computername server1 -FilePath .\list.ps1
Тут важно отметить, что вам не нужно самостоятельно копировать файл скрипта ps1 на удаленный компьютер. Результаты выполнения скрипта выводятся в консоль.
Достаточно часто возникает необходимость одновременно выполнять одну и ту же команду/скрипт на нескольких компьютерах. С помощью Invoke-Command это реализуется довольно просто. Можно перечислить имена компьютеров, разделив из запятыми в аргументе -ComputerName.
Invoke-Command -ScriptBlock -ComputerName server1,server2,server3
Либо поместить из в массив:
$srv_list = @(″server4″,″server5″,″server6″)
Invoke-Command -ScriptBlock -ComputerName $servers
Или загрузить из тестового файла:
Invoke-Command -ScriptBlock –ComputerName (Get-Content .\servers_list.txt)
Команда будет выполнена на каждом компьютере, а результаты ее выполнения будут отображаться в консоли.
Примечание. У командлета Invoke-Command есть параметр ThrottleLimit который позволяет установить максимальное количество компьютером, на которых одновременно может выполнятся одна и та же команда. По умолчанию число компьютером ограничено цифрой 32. При необходимости это число можно увеличить, но имейте в виду, что увеличение этого параметра увеличивает нагрузку на процессор и память вашего компьютера, поэтому эту операцию нужно выполнять с осторожностью.
Если установлен модуль ActiveDirectory для PowerShell, становится возможным одновременно запускать команды на множестве компьютеров, выбираемых из AD с использованием конвейеров:
Get-ADComputer -Filter * -properties name | select >| Invoke-Command -ScriptBlock
Каждый раз при запуске Invoke-Command, создается новый сеанс, который потребляет некоторое время процессора и ресурсы. Чтобы избежать лишнего расходования ресурсов, можно использовать один сеанс для выполнения всех команд. Например, создадим новый сеанс sess1 с компьютером computer1 и присвоим его переменной $session, а затем выполним свою задачу в этом сеансе:
$session = New-PSSession -ComputerName computer1 -Name sess1
Invoke-Command -ScriptBlock < Restart-Service spooler >-Session $session
Данный Сеанс будет активен, пока вы не закроете консоль PowerShell. Вы также можете закрыть сеанс (Disconnect-PSSession) или удалить его (Remove-PSSession).
Чтобы вернуть компьютер в исходное состояние в PowerShell, используйте стандартную программу командной строки, инструментарий WMI или класс CIM. Хотя PowerShell используется только для запуска программы, сведения об изменении состояния электропитания для компьютера в PowerShell иллюстрируют некоторые важные особенности работы с внешними средствами в PowerShell.
Syntax
Выход из текущего сеанса
Выйти из сеанса в локальной системе можно несколькими способами. Самый простой заключается в использовании программы командной строки удаленного рабочего стола или служб терминалов — logoff.exe (для получения дополнительных сведений введите logoff /? в командной строке PowerShell). Чтобы выйти из текущего активного сеанса, введите logoff без аргументов.
Можно также использовать средство shutdown.exe с параметром выхода:
Еще один вариант — использование инструментария WMI. Класс Win32_OperatingSystem имеет метод Shutdown. Вызов метода с флагом 0 инициирует выход из системы:
Дополнительные сведения о методе Shutdown класса Win32_OperatingSystem см. в этой статье.
Блокировка компьютера
Единственным способом непосредственной блокировки компьютера с помощью стандартных средств является вызов функции LockWorkstation() в user32.dll:
Эта команда немедленно блокирует рабочую станцию. Она использует rundll32.exe, который запускает библиотеки DLL Windows (и сохраняет их библиотеки для многократного использования), чтобы запустить user32.dll — библиотеку функций управления Windows.
Если рабочая станция блокируется при включенном быстром переключении пользователей, например в Windows XP, компьютер отображает экран входа в систему вместо того, чтобы запустить заставку текущего пользователя.
Чтобы завершить работу конкретных сеансов на сервере терминалов, используйте программу командной строки tsshutdn.exe.
Example 2: Restart multiple computers
Restart-Computer can restart remote and local computers. The ComputerName parameter accepts an array of computer names.
Examples
Parameters
Specifies one computer name or a comma-separated array of computer names. Restart-Computer accepts ComputerName objects from the pipeline or variables.
Type the NetBIOS name, an IP address, or a fully qualified domain name of a remote computer. To specify the local computer, type the computer name, a dot . , or localhost.
This parameter doesn't rely on PowerShell remoting. You can use the ComputerName parameter even if your computer isn't configured to run remote commands.
If the ComputerName parameter isn't specified, Restart-Computer restarts the local computer.
Type: | String [ ] |
Aliases: | CN, __SERVER, Server, IPAddress |
Position: | 0 |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Prompts you for confirmation before running Restart-Computer .
Type: | SwitchParameter |
Aliases: | cf |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Specifies a user account that has permission to do this action. The default is the current user.
Type a user name, such as User01 or Domain01\User01, or enter a PSCredential object generated by the Get-Credential cmdlet. If you type a user name, you're prompted to enter the password.
Credentials are stored in a PSCredential object and the password is stored as a SecureString.
For more information about SecureString data protection, see How secure is SecureString?.
Type: | PSCredential |
Position: | 1 |
Default value: | Current user |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Specifies the frequency of queries, in seconds. PowerShell queries the service specified by the For parameter to determine whether the service is available after the computer is restarted.
This parameter is valid only together with the Wait and For parameters.
This parameter was introduced in Windows PowerShell 3.0.
If the Delay parameter isn't specified, Restart-Computer uses a five second delay.
Type: | Int16 |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Specifies the behavior of PowerShell as it waits for the specified service or feature to become available after the computer restarts. This parameter is only valid with the Wait parameter.
- Default: Waits for PowerShell to restart.
- PowerShell: Can run commands in a PowerShell remote session on the computer.
- WMI: Receives a reply to a Win32_ComputerSystem query for the computer.
- WinRM: Can establish a remote session to the computer by using WS-Management.
This parameter was introduced in Windows PowerShell 3.0.
Type: | WaitForServiceTypes |
Accepted values: | Wmi, WinRM, PowerShell |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Forces an immediate restart of the computer.
Type: | SwitchParameter |
Aliases: | f |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Specifies the duration of the wait, in seconds. When the timeout elapses, Restart-Computer returns to the command prompt, even if the computers aren't restarted.
The Timeout parameter is only valid with the Wait parameter. Timeout overrides the Wait parameter's indefinite waiting period.
This parameter was introduced in Windows PowerShell 3.0.
Type: | Int32 |
Aliases: | TimeoutSec |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Restart-Computer suppresses the PowerShell prompt and blocks the pipeline until the computers have restarted. You can use this parameter in a script to restart computers and then continue to process when the restart is finished.
The Wait parameter waits indefinitely for the computers to restart. You can use Timeout to adjust the timing and the For and Delay parameters to wait for particular services to become available on the restarted computers.
The Wait parameter isn't valid when you're restarting the local computer. If the value of the ComputerName parameter contains the names of remote computers and the local computer, Restart-Computer generates a non-terminating error for Wait on the local computer, but waits for the remote computers to restart.
This parameter was introduced in Windows PowerShell 3.0.
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Shows what would happen if the Restart-Computer runs. The Restart-Computer cmdlet isn't run.
Type: | SwitchParameter |
Aliases: | wi |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Specifies the mechanism that is used to authenticate the user credentials. This parameter was introduced in Windows PowerShell 3.0.
Credential Security Service Provider (CredSSP) authentication, in which the user credentials are passed to a remote computer to be authenticated, is designed for commands that require authentication on more than one resource, such as accessing a remote network share. This mechanism increases the security risk of the remote operation. If the remote computer is compromised, the credentials that are passed to it can be used to control the network session.
В этой статье я покажу как удаленно узнать время загрузки нескольких компьютеров с помощью простого PowerShell скрипта. Идея этой статьи возникла недавно, когда я по RDP перезагрузил несколько удаленных серверов Windows и захотел узнать, когда загрузилась на них операционная система.
В Powershell 3.0 и выше для получения информации о времени загрузки Windows можно использовать командлет Get-CimInstance. Командлет Get-CimInstance позволяет обращаться к различным классам Win32_OperatingSystem. Полный список доступных классов и методов можно вывести с помощью команды:
Get-CimInstance Win32_OperatingSystem | Get-Member
В данном случае нас интересует свойство LastBootUpTime.
Проверим время загрузки компьютер, на котором запускается команда:
Get-CimInstance -ClassName win32_OperatingSystem | select csname, lastbootuptime
Чтобы проверить время загрузки Windows на удаленном компьютере, нужно использовать атрибут ComputerName. Например, проверим дату загрузки Windows на компьютере с именем Server1.
Get-CimInstance -ClassName win32_operatingsystem -ComputerName Server1| select csname, lastbootuptime
В PowerShell 2.0 командлет Get-CimInstance отсутствует. Поэтому для получения информации из WMI классов нужно использовать другой командлет — Get-WMIObject.
Для преобразования времени из формата TimeStamp в привычный вид мы воспользовались командлетом ConverttoDateTime.
Проверим время загрузки Windows сразу на нескольких серверах (имена серверов указываются через запятую):
Если нужно узнать время загрузки сразу на большом количестве компьютеров в сети, список компьютеров можно сохранить в текстовый файл (каждая строка – отдельное имя компьютера) и с помощью цикла foreach проверить время загрузки:
$Servers = Get-Content C:\PS\ComputersList.txt
foreach ($Server in $Servers)Get-CimInstance -ClassName win32_operatingsystem -ComputerName $Server | select csname, lastbootuptime
>
Статистика длительности работы компьютера может пригодиться для проверки работы серверов или в случае мониторинга пользователей на предмет нарушения техники безопасности (пожарной и информационной) и для многих других случаев. Такую статистику можно увидеть несколькими путями:
- С помощью диспетчера задач (Task Manager).
- С помощью Systeminfo.
- В логах. Например по событию 6005, которое показывает время включения хоста.
- С помощью класса WMI Win32_OperatingSystem, по свойству LastBootUpTime.
Каждый из этих способов по своему удобен, но три из них теряют актуальность, если нужно проверить эти данные на множестве компьютеров. В случае с WMI такие данные можно получить с любого хоста. Я не исключаю, что такие данные можно получить с команд типа Get-NetAdapter или Get-ComputerInfo.
Следующим образом мы получим дату включения хоста используя команду CMD WMIC:
Аналогичный результат, но используя команду получения WMI в Powershell:
Мы можем различить дату, но желательно иметь сразу более человеческое представление. Можно преобразовать результат и с WMI, но в случае с CIM он сразу корректный:
В зависимости от региональной версии ОС формат может быть разный:
Наша задача посмотреть сколько времени работает компьютер, а не когда он был запущен. Для этого получим разницу во времени:
Попробуем выполнить команду на удаленном компьютере с Powershell, такой способ требует дополнительной настройки. Я обернул наш скрипт в функцию Get-UpTime, что бы было удобнее ее вызывать:
Я выполняю две удаленные команды на одном и том же компьютере, так как он у меня один, но для наглядности продемонстрировано что можно иметь множество хостов. Я так же отсортировал результат с помощью Sort-Object сначала по дням, затем по часам. Нам не обязательно использовать метод Invoke-Command, так как сам командлет CIM имеет такую возможность, но первый способ мне нравится больше:
В каждом варианте я использовал параметр со значением -ErrorAction SilentlyContinue , который пропускает некоторые ошибки в Powershell. Это делается на случай, если какой-то хост окажется выключенным.
Теперь попробуем использовать нашу функцию Get-Uptime для получения данных со всех компьютеров в ActiveDirectory и экспортируем результат в CSV:
Далее этот файл можно открыть в Excel и просмотреть результат. Я так же убрал сортировку, так как это можно сделать через Excel. Выполнение подобной процедуры будет долгим, если в ActiveDirectory много компьютеров и его можно сузить с помощью ключей Filter и SearchBase в команде Powershell Get-ADUser.
Example 1: Restart the local computer
Restart-Computer restarts the local computer.
Завершение работы или перезапуск компьютера
Завершение работы и перезапуск компьютеров обычно относятся к схожим типам задач. Средства, завершающие работу компьютера, обычно также перезапускают его и наоборот. Есть два варианта непосредственной перезагрузки компьютера из PowerShell. Используйте tsshutdn.exe или shutdown.exe с соответствующими аргументами. Подробные сведения об использовании можно получить, запустив tsshutdn.exe /? или shutdown.exe /? .
Операции завершения работы и перезапуска можно также выполнять непосредственно из PowerShell.
Чтобы завершить работу компьютера, используйте команду Stop-Computer.
Чтобы перезапустить операционную систему, используйте команду Restart-Computer.
Чтобы выполнить немедленную перезагрузку компьютера, используйте параметр -Force.
Restarts the operating system on local and remote computers.
Example 4: Force restart of computers listed in a text file
This example forces an immediate restart of the computers listed in the Domain01.txt file. The computer names from the text file are stored in a variable. The Force parameter forces an immediate restart.
Get-Content uses the Path parameter to get a list of computer names from a text file, Domain01.txt. The computer names are stored in the variable $Names . Get-Credential prompts you for a username and password and stores the values in the variable $Creds . Restart-Computer uses the ComputerName and Credential parameters with their variables. The Force parameter causes an immediate restart of each computer.
Example 3: Get computer names from a text file
Restart-Computer gets a list of computer names from a text file and restarts the computers. The ComputerName parameter isn't specified. But because it's the first position parameter, it accepts the computer names from the text file that are sent down the pipeline.
Get-Content uses the Path parameter to get a list of computer names from a text file, Domain01.txt. The computer names are sent down the pipeline. Restart-Computer restarts each computer.
Example 6: Restart a remote computer and wait for PowerShell
Restart-Computer restarts the remote computer and then waits up to 5 minutes (300 seconds) for PowerShell to become available on the restarted computer before it continues.
Restart-Computer uses the ComputerName parameter to specify Server01. The Wait parameter waits for the restart to finish. The For specifies that PowerShell can run commands on the remote computer. The Timeout parameter specifies a five-minute wait. The Delay parameter queries the remote computer every two seconds to determine whether it's restarted.
Description
This cmdlet is only available on the Windows platform.
The Restart-Computer cmdlet restarts the operating system on the local and remote computers.
You can use the parameters of Restart-Computer to run the restart operations, to specify the authentication levels and alternate credentials, to limit the operations that run at the same time, and to force an immediate restart.
Starting in Windows PowerShell 3.0, you can wait for the restart to complete before you run the next command. Specify a waiting time-out and query interval, and wait for particular services to be available on the restarted computer. This feature makes it practical to use Restart-Computer in scripts and functions.
Example 7: Restart a computer by using WsmanAuthentication
Restart-Computer restarts the remote computer using the WsmanAuthentication mechanism. Kerberos authentication determines whether the current user has permission to restart the remote computer. For more information, see AuthenticationMechanism.
Restart-Computer uses the ComputerName parameter to specify the remote computer, Server01. The WsmanAuthentication parameter specifies the authentication method as Kerberos.
Читайте также: