Выполнение удаленных команд — PowerShell
- Чтение занимает 3 мин
Оцените свои впечатления
Да Нет
Хотите оставить дополнительный отзыв?
Отзывы будут отправляться в корпорацию Майкрософт. Нажав кнопку «Отправить», вы разрешаете использовать свой отзыв для улучшения продуктов и служб Майкрософт. Политика конфиденциальности.
Отправить
В этой статье
Одна команда Windows PowerShell позволяет запускать команды на одном или сотнях компьютеров. Windows PowerShell поддерживает удаленное вычисление с помощью разных технологий, включая WMI, RPC и WS-Management.
PowerShell Core поддерживает инструментарий WMI, WS-Management и удаленное взаимодействие через SSH. В PowerShell 6 RPC больше не поддерживается. В PowerShell 7 и более поздних версиях RPC поддерживается только в Windows.
Дополнительные сведения об удаленном взаимодействии в PowerShell Core см. в следующих статьях:
Удаленное взаимодействие с Windows PowerShell без настройки
Многие командлеты Windows PowerShell имеют параметр ComputerName, который позволяет собирать данные и изменять параметры одного или нескольких удаленных компьютеров. Эти командлеты используют разные протоколы связи и работают во всех операционных системах Windows без специальной настройки.
В эти командлеты входят следующие:
Обычно командлеты, которые поддерживают удаленное взаимодействие без специальной настройки, имеют параметр ComputerName, но не имеют параметра Session. Чтобы найти эти командлеты в сеансе, введите:
Get-Command | where { $_.parameters.keys -contains "ComputerName" -and $_.parameters.keys -notcontains "Session"}
Служба удаленного взаимодействия Windows PowerShell
Благодаря использованию протокола WS-Management служба удаленного взаимодействия Windows PowerShell позволяет запустить любую команду Windows PowerShell на одном или нескольких удаленных компьютерах. Вы можете устанавливать постоянные подключения, запускать интерактивные сеансы и выполнять скрипты на удаленных компьютерах.
Чтобы использовать службу удаленного взаимодействия Windows PowerShell, удаленный компьютер должен быть настроен для удаленного управления. Дополнительные сведения, в том числе инструкции, см. в разделе about_Remote_Requirements.
После настройки службы удаленного взаимодействия Windows PowerShell вы получите доступ ко многим стратегиям удаленного взаимодействия. В этой статье перечислены только некоторые из них. См. дополнительные сведения об удаленном взаимодействии.
Запуск интерактивного сеанса
Чтобы запустить интерактивный сеанс с одним удаленным компьютером, используйте командлет Enter-PSSession. Например, чтобы запустить интерактивный сеанс с удаленным компьютером Server01, введите:
Enter-PSSession Server01
В командной строке отобразится имя удаленного компьютера. Все команды, введенные в командной строке, запускаются на удаленном компьютере, а результаты отображаются на локальном компьютере.
Чтобы завершить интерактивный сеанс, введите:
Exit-PSSession
См. дополнительные сведения о командлетах Enter-PSSession и Exit-PSSession:
Выполнение удаленной команды
Чтобы выполнить команду на одном или нескольких компьютерах, используйте командлет Invoke-Command. Например, чтобы выполнить команду Get-UICulture на удаленных компьютерах Server01 и Server02, введите:
Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-UICulture}
Выходные данные будут возвращены на ваш компьютер.
LCID Name DisplayName PSComputerName
---- ---- ----------- --------------
1033 en-US English (United States) server01.corp.fabrikam.com
1033 en-US English (United States) server02.corp.fabrikam.com
Запуск сценария
Чтобы запустить скрипт на одном или нескольких удаленных компьютерах, используйте параметр FilePath командлета Invoke-Command
. Сценарий должен быть включен или доступен для локального компьютера. Результаты будут возвращены на локальный компьютер.
Например, следующая команда выполняет скрипт DiskCollect.ps1 на удаленных компьютерах Server01 и Server02.
Invoke-Command -ComputerName Server01, Server02 -FilePath c:\Scripts\DiskCollect.ps1
Установка постоянного подключения
Используйте командлет New-PSSession
для создания постоянного сеанса на удаленном компьютере. В следующем примере создаются удаленные сеансы на удаленных компьютерах Server01 и Server02. Объекты сеанса хранятся в переменной $s
.
$s = New-PSSession -ComputerName Server01, Server02
После установки сеансов в них можно выполнить любую команду. Так как сеансы являются постоянными, вы можете собирать данные из одной команды и использовать их в другой.
Например, следующая команда выполняет команду Get-Hotfix в сеансах в переменной $s и сохраняет результаты в переменной $h. Переменная $h создается в каждом сеансе в переменной $s, но она не существует в локальном сеансе.
Invoke-Command -Session $s {$h = Get-HotFix}
Теперь вы можете использовать данные в переменной $h
с другими командами в том же сеансе. Результаты отобразятся на локальном компьютере. Пример:
Invoke-Command -Session $s {$h | where {$_.InstalledBy -ne "NTAUTHORITY\SYSTEM"}}
Расширенная служба удаленного взаимодействия
Это и есть служба удаленного взаимодействия Windows PowerShell.
Windows PowerShell включает поставщик WSMan. Поставщик создает диск WSMAN:
, который позволяет перемещаться по иерархии параметров конфигурации на локальном и удаленном компьютерах.
См. дополнительные сведения о поставщике WSMan и командлетах WS-Management или введите команду
в консоли Windows PowerShell.
Дополнительные сведения можно найти в разделе
Справку по ошибкам службы удаленного взаимодействия см. в разделе about_Remote_Troubleshooting.
См. также:
Изменение имени компьютера Windows в Server 2012
Инструкции
Резюме статьи. В этой статье содержатся инструкции по изменению имени компьютера Windows в Windows Server Core с помощью утилиты Sconfig и оболочки Windows PowerShell
Решение:
Выполните следующие действия, чтобы изменить имя компьютера с помощью инструмента Server Configuration в рабочей группе или на автономном сервере под управлением Windows Server Core.
1. Введите Sconfig и нажмите клавишу Enter в окне командной строки, чтобы открыть инструмент Server Configuration.
2. Введите 2 и нажмите Enter для продолжения. Введите новое имя компьютера и нажмите Enter, чтобы изменить имя компьютера.
3. Нажмите Да в окне Перезапуск, чтобы перезапустить компьютер.
Выполните следующие действия, чтобы изменить имя компьютера с помощью инструмента Server Configuration на присоединенном к домену сервере под управлением Windows Server Core.
1. Введите Sconfig и нажмите клавишу Enter в окне командной строки, чтобы открыть инструмент Server Configuration.
2. Введите 2 и нажмите Enter для продолжения. Введите новое имя компьютера и нажмите Enter, чтобы изменить имя компьютера.
3. Введите пароль администратора домена и нажмите клавишу Enter для продолжения.
4. Нажмите Да в окне
Выполните следующие действия, чтобы изменить имя компьютера с помощью оболочки Windows PowerShell в рабочей группе или на автономном сервере под управлением Windows Server Core.
1. Введите Start PowerShell и нажмите клавишу Enter в окне командной строки, чтобы запустить оболочку Windows PowerShell.
2. Введите Rename-Computer -NewName CN1 -LocalCredential WS\Administrator -PassThru и нажмите Enter, чтобы изменить имя компьютера. Вместо CN1 введите новое имя компьютера, а вместо WS — текущее имя компьютера.
3. Введите пароль локального администратора и нажмите OK, чтобы завершить изменение.
4. Введите shutdown -r -t 0, чтобы перезагрузить сервер.
Выполните следующие действия, чтобы изменить имя компьютера с помощью оболочки Windows PowerShell на присоединенном к домену сервере под управлением Windows Server Core.
1. Введите Start PowerShell и нажмите клавишу Enter в окне командной строки, чтобы запустить оболочку Windows PowerShell.
2. Введите Rename-Computer -NewName CN1 -DomainCredential vdomain\Administrator -PassThru и нажмите Enter, чтобы изменить имя компьютера. Вместо CN1 введите имя компьютера, а вместо vdomain — имя домена.
3. Введите пароль администратора домена и нажмите OK, чтобы завершить изменение.
4. Введите shutdown -r -t 0, чтобы перезагрузить сервер.
Дополнительная информация
Эта информация относится к Windows Server 2012 и Windows Server 2012 R2.
Дополнительную информацию о команде оболочки Windows PowerShell -NewName можно найти на портале TechNet.
21 февр. 2021
Оцените эту статью
Благодарим вас за отзыв.
К сожалению, наша система обратной связи в настоящее время не работает. Повторите попытку позже.
Комментарии не должны содержать следующие специальные символы: ()\
Получение объектов WMI (Get-WmiObject)
Инструментарий управления Windows (WMI) является ключевой технологией системного администрирования Windows, поскольку она предоставляет широкий спектр сведений в унифицированном виде. Поскольку спектр возможностей WMI достаточно широк, командлет Windows PowerShell — самый полезный для доступа к объектам WMI Get-WmiObject является одним из наиболее полезных в работе. Мы расскажем о том, как командлет Get-WmiObject обращается к объектам WMI, а затем о том, как использовать объекты WMI для выполнения особых задач.
Первая проблема, с которой сталкивается большинство пользователей WMI, — это выяснение того, что можно сделать с помощью интерфейса WMI. Классы WMI описывают ресурсы, которыми можно управлять. Имеются сотни классов WMI, некоторые из которых содержат множество свойств.
Командлет Get-WmiObject решает эту проблему, предоставляя сведения об интерфейсе WMI. Список классов WMI, доступных на локальном компьютере, можно получить, введя команду:
PS> Get-WmiObject -List __SecurityRelatedClass __NTLMUser9X __PARAMETERS __SystemSecurity __NotifyStatus __ExtendedStatus Win32_PrivilegesStatus Win32_TSNetworkAdapterSettingError Win32_TSRemoteControlSettingError Win32_TSEnvironmentSettingError . ..
Можно извлечь те же сведения на удаленном компьютере, указав в параметре ComputerName имя компьютера или его IP-адрес:
PS> Get-WmiObject -List -ComputerName 192.168.1.29 __SystemClass __NAMESPACE __Provider __Win32Provider __ProviderRegistration __ObjectProviderRegistration ...
Список классов, возвращаемый удаленным компьютером, может различаться в зависимости от операционной системы компьютера и определенных расширений WMI, добавленных установленными приложениями.
Примечание. | |
При использовании командлета Get-WmiObject для подключения к удаленному компьютеру на последнем должен быть запущен интерфейс WMI и используемая учетная запись должна входить в группу локальных администраторов на удаленном компьютере (конфигурация по умолчанию). На удаленной системе может быть не установлена оболочка Windows PowerShell. Это позволяет администрировать операционные системы, на которых не запущена оболочка Windows PowerShell, но имеется интерфейс WMI. |
Можно использовать параметр ComputerName при подключении к локальной системе. Можно использовать имя локального компьютера, его IP-адрес (или петлевой адрес 127.0.0.1) либо «.» (в стиле интерфейса WMI) в качестве имени компьютера. Если на компьютере с именем «Admin01» и IP-адресом 192.168.1.90 запущена оболочка Windows PowerShell, следующие команды возвратят список классов WMI для этого компьютера:
Get-WmiObject -List Get-WmiObject -List -ComputerName . Get-WmiObject -List -ComputerName Admin01 Get-WmiObject -List -ComputerName 192.168.1.90 Get-WmiObject -List -ComputerName 127.0.0.1 Get-WmiObject -List -ComputerName localhost
Командлет Get-WmiObject использует по умолчанию пространство имен root/cimv2. Чтобы задать другое пространство имен WMI, воспользуйтесь параметром Namespace и укажите путь к соответствующему пространству имен:
PS> Get-WmiObject -List -ComputerName 192.168.1.29 -Namespace root __SystemClass __NAMESPACE __Provider __Win32Provider ...
Если имя класса WMI уже известно, можно немедленно получить сведения о нем. Например, одним из классов WMI, используемых для получения сведений о компьютере, является класс Win32_OperatingSystem.
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . SystemDirectory : C:\WINDOWS\system32 Organization : Global Network Solutions BuildNumber : 2600 RegisteredUser : Oliver W. Jones SerialNumber : 12345-678-9012345-67890 Version : 5.1.2600
Хотя показаны все параметры, команда может быть представлена в более короткой форме. Параметр ComputerName не является обязательным при подключении к локальной системе. Мы покажем это, чтобы продемонстрировать наиболее общий случай и напомнить об этом параметре. По умолчанию параметр Namespace имеет значение root/cimv2 и может быть опущен. В конце концов, большинство командлетов позволяют опускать имя типовых параметров. В командлете Get-WmiObject, если для первого параметра имя не указано, Windows PowerShell считает его параметром Class. Это значит, что последнюю команду можно было ввести в таком виде:
Get-WmiObject Win32_OperatingSystem
Класс Win32_OperatingSystem имеет больше свойств, чем показано тут. Можно воспользоваться командлетом Get-Member, чтобы показать все свойства. Свойства класса WMI автоматически доступны, как и другие свойства объекта:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Get-Member -MemberType Property TypeName: System.Management.ManagementObject#root\cimv2\Win32_OperatingSyste m Name MemberType Definition ---- ---------- ---------- __CLASS Property System.String __CLASS {... ... BootDevice Property System.String BootDevic... BuildNumber Property System.String BuildNumb... ...
Вывод свойств, не имеющих значений по умолчанию, с помощью командлетов Format
Если необходимо показать сведения, содержащиеся в классе Win32_OperatingSystem, которые не выводятся по умолчанию, можно воспользоваться командлетом Format. Например, если нужно показать сведения о количестве доступной памяти, введите:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Format-Table -Property TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory,FreeSpaceInPagingFiles TotalVirtualMemorySize TotalVisibleMem FreePhysicalMem FreeVirtualMemo FreeSpaceInPagi ory ry ngFiles --------------- --------------- --------------- --------------- --------------- 2097024 785904 305808 2056724 1558232
Примечание. | |
Подстановочные знаки допускаются в именах свойств в командлете Format-Table, поэтому последний элемент конвейера может быть сокращен до Format-Table -Property TotalV*,Free* |
Сведения о памяти могут быть показаны в более пригодном виде для просмотра, если отформатировать список, выполнив команду:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Format-List TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory,FreeSpaceInPagingFiles TotalVirtualMemorySize : 2097024 TotalVisibleMemorySize : 785904 FreePhysicalMemory : 301876 FreeVirtualMemory : 2056724 FreeSpaceInPagingFiles : 1556644
Обзор новых командлетов PowerShell V2 CTP3 — Active Directory/Workgroup
Продолжая цикл постов о новых командлетах в PowerShell V2 CTP3 хочу рассказать про несколько командлетов для управлением компьютера как клиента в домене Active Directory или рабочей группе. Отмечу сразу, что эти командлеты не управляют доменом Active Directory, а только компьютером-клиентом домена (не знаю, как по-русски правильно сформулировать мысль). По сути эти командлеты повторяют аналог утилиты netdom.exe и вот их список:
- Add-Computer
- Remove-Computer
- Rename-Computer
- Reset-ComputerMachinePassword
- Test-ComputerSecureChannel
и ещё 2 на закуску:
- Restart-Computer
- Stop-Computer
Ну и как обычно — рассмотрим каждый из них:
1) Add-Computer — добавляет компьютер к домену Active Directory или перемещает компьютер между рабочими группами (Workgroup). Данный командлет содержит следующие параметры и ключи:
- -ComputerName — параметр. Имя компьютера, который нужно включить в домен или рабочую группу. Можно указывать как NetBIOS имена, так и FQDN (Fully Qualified Domain Name) и IP адреса компьютеров. Для локального компьютера можно использовать точку ( . ) или localhost или не указывать этот параметр совсем, поскольку по умолчанию будет использовать именно локальная машина. Так же можно указывать несколько компьютеров перечисляя их через запятую. Имена можно передавать в командлет по конвейеру по свойству ComputerName.
- -Credential — параметр. Учётные данные для аутентификации в домене или на удалённых компьютерах рабочей группы. Формат учётных данных такой же, как и в подключениях WMI. Для этого можно использовать командлет Get-Credential. Данный параметр следует использовать только при необходимости использования альтернативных учётных данных. Если не указан, то будут использоваться учётные данные текущего пользователя.
- -DomainName — параметр. DNS имя домена, куда будет подключаться компьютер. Этот параметр является обязательным при подключении к домену.
- -WorkgroupName — параметр. Название рабочей группы, в которую перемещается компьютер. Обязателен при переводе компьютера из одной рабочей группы в другую.
- -OUPath — параметр. Если заранее учётная запись компьютера заранее не создана в AD, то указание этого параметра позволяет добавить компьютер в нужный OU с созданием учётной записи в нём. Если этот параметр не указан, то компьютер будет помещён в контейнер по умолчанию — CN Computers. Так же этот параметр не нужно указывать при перемещении компьютера между рабочими группами.
- -Server — параметр. Используется только при подключении к домену. Позволяет выбирать контроллер домена, который будет производить ввод компьютера в домен и установку пароля компьютера в домене. Параметр опциональный и может иметь смысл при добавлении машин в домен в удалённых сайтах. Указывается в формате DomainName\DCName.
- -Unsecure — ключ. Операция по вводу компьютера в домен или рабочую группу будет производиться без установки защищённого канала между клиентом и сервером (контроллером домена). В домене с жёсткими политиками безопасности данный ключ может дать сбой.
- -Reboot — ключ. Как известно любое изменение местоположения компьютера в сети (ввод в домен, вывод из домена, смена рабочей группы) требуют перезагрузки машины.
Примечание: может показаться, что ключ -Reboot очень полезный, но мне так не кажется. И вот почему. Если командлет сам не перезагружает машину после завершения операции, то это нужно сделать вручную. Но перезагружать машину можно только в случае если всё прошло успешно. Но если по каким-то причинам ожидаемый результат не был достигнут, то компьютер будет перезагружен в пустую. Я на этом не настаиваю, но мне это видится именно так.
Hint: не забывайте, что если указываются позиционные параметры, то их имена указывать не обязательно. Например, ComputerName позиционно является первым параметром и если указывать за командлетом сразу имена компьютеров, то название параметра -ComputerName можно и не указывать.
По умолчанию данный командлет не выводит результат на экран, поэтому для вывода результата исполнения можно использовать ключи -PassThru или -Verbose. Так же командлет имеет такие полезные ключи как -Confirm для ручного подтверждения выполнения операции и -WhatIf для моделирования работы командлета. И несколько примеров использования командлета:
Add-Computer -DomainName contoso.com -Credential (Get-Credential) -OUPath OU=Test,OU=»3th floor»,DC=Contoso,DC=com -Reboot
Add-Computer -ComputerName (Get-Content Comps.txt) -WorkgroupName MSHome -PassThru
2) Remove-Computer — удаляет компьютер из домена или рабочей группы. Содержит параметры -ComputerName, -Credential (учётные данные пользователя, который имеет право на вывод машины из домена или локального администратора, если компьютер перемещается в рабочих группах), -Reboot, -Confirm, -PassThru и -WhatIf. Правила использования этих параметров и ключей такие же, что и для Add-Computer, но только в контексте удаления, а не ввода машины во что-то. Пример:
Remove-Computer -ComputerName computer1, computer2 -Credential contoso.com\Administrator -PassThru -Reboot — выводит компьютер из домена. Следует учесть, что при выполнении команды будет запрошен пароль учётной записи, указанной в Credential.
Remove-Computer MyComputer — просто удаляет компьютер из рабочей группы (интересно, куда? 😀 )
Примечание: ни в коем случае не удаляйте так контроллеры домена. Их сначала нужно понизить до роли рядового сервера командой dcpromo и только потом с помощью UI, netdom или командлета Remove-Computer выводить из домена.
3) Rename-Computer — переименовывает компьютер или компьютеры в рабочей группе или домене Active Directory. Обычно использует следующие параметры:
- -ComputerName — имя компьютера, которые нужно переименовать. Можно не указывать, если переименовывается локальный компьютер. Если компьютер находится в домене, то следует указывать его полное FQDN имя. Не поддерживает указание нескольких компьютеров, только одного.
- -NewComputerName — новое имя компьютера. Если машина находится в домене, то переименовывается и её учётная запись.
- -Credential — учётные данные. Данный параметр является обязательным при переименовании удалённых компьютеров-членов домена (кроме переименовывания локального компьютера).
так же командлет содержит такие ключи как -Confirm, -Reboot и -WhatIf.
Примечание: ни в коем случае не пытайтесь этим командлетом переименовать контроллер домена!
4) Reset-ComputerMachinePassword — сбрасывает пароль учётной записи компьютера в базе Active Directory. Используется только для доменных компьютеров. Данный командлет можно использовать при трудностях аутентификации компьютера в домене или при устаревании пароля. Несколько типичных случаев, когда требуется сброс пароля компьютера — компьютер не аутентифицировался в домене более 30 или 60 дней, в зависимости от настроек домена; компьютер был восстановлен из бэкапа (SystemState), срок которого старше 30 или 60 дней или компьютер был восстановлен из образа без дополнительного восстановления актуального SystemState и другие случаи.. Подробности этой темы выходят за рамки этого поста.
Из актуальных параметров содержит -ComputerName (можно указывать несколько компьютеров. Допускаются FQDN, NetBIOS имена или IP адреса), -Server — имя контроллера домена, который будет производить сброс пароля (не обязательный параметр) и -Credental — имя пользователя, который имеет права сброса паролей указанных компьютеров. Из ключей можно выделить такие как -Confirm и -WhatIf. Общий синтаксис такой:
Reset-ComputerMachinePassword (get-content comp.txt) — переустановит пароль всех компьютеров из списка comp. txt
Reset-ComputerMachinePassword — переустановит пароль текущего компьютера
Reset-ComputerMachinePassword -Server dc1.contoso.com -Credential (Get-Credential) -Confirm — переустановит пароль локального компьютера на контроллере домена с именем DC1 и с вводом альтернативных учётных записей. После запуска потребует подтверждения операции.
5) Test-ComputerSecureChannel — проверяет возможность установки безопасного канала между клиентом и сервером. Работает только в домене и возвращает True или False. Имеет один параметр и ключ:
- -Server — параметр. Имя компьютера в домене (допускается использовать FQDN, NetBIOS имена или IP адрес). Допускается указание только одного компьютера, с которым хотите проверить работоспособность безопасного канала. Параметр обязательный, поскольку нету смысла проверять защищённый канал с самим собой 🙂
- -Repair — ключ. Если команда выводит False, то при указании этого ключа команда будет пытаться восстановить его.
И содержит дополнительные ключи как —Confirm и -WhatIf.
Я не придумал к какой категории присвоить эти 2 командлета и решил их описать здесь. Кстати, очень удобные командлеты:
6) Restart-Computer и Stop-Computer. Первый командлет перезагружает локальный или удалённый компьютер (или несколько), а второй выключает их совсем. Это очень полезно, поскольку я видел как минимум 5 различных решений перезагрузки/выключения компьютеров в скриптах PowerShell. Как правило это либо WMI, либо использование штатного shutdown.exe (кстати говоря, я им пользуюсь всегда) либо ещё что-нибудь. Теперь можно будет этот момент стандартизировать. Много говорить про них не буду, а скажу только, что эти командлеты используют метод Win32Shutdown WMI класса Win32_OperatingSystem. Следовательно эти командлеты обладают всеми новыми возможностями, которые описаны в предыдущей статье: Обзор новых командлетов PowerShell V2 CTP3 — WMI. Одно из преимуществ — можно использовать фоновую работу. Скажем, отправить в ребут сотню компьютеров и пока это всё происходит спокойно работать в консоли (шутка 🙂 ). Поэтому в этих командлетах можно использовать такие параметры и ключи как -AsJob, Impersonate, Authentication, ComputerName и другие. Из уникальных отмечу один параметр:
- -ThrottleLimit — указывает количество одновременных удалённых подключений для конкретно этой команды. Если компьютеров будет много в этой команде, то чтобы не загружать сеть можно ограничить, скажем, по 10-20 одновременных подключений. По умолчанию максимум одновременно установлено 32 подключения.
и ключ:
- -Force — без комментариев. Точнее перезагружает или выключает компьютер без спроса, форсирует закрытие всех приложений, что может быть риском потери данных, если они в этот момент не были сохранены.
На сегодня вроде всё. Вроде ничего не пропустил.
Как получить имя компьютера с помощью PowerShell
Вам нужно найти имя локального или удаленного компьютера Windows в сценарии PowerShell? Не смотрите дальше. В этом руководстве вы узнаете, как использовать PowerShell для получения имени компьютера несколькими различными, а иногда и неожиданными способами.
Предварительные требования
Эта статья представляет собой практическое руководство. Если вы хотите применить концепции, изученные в этом руководстве, убедитесь, что у вас установлен PowerShell. Вот и все! В статье будет использоваться PowerShell 7 (последняя версия на момент написания), но Windows PowerShell, вероятно, также будет работать.
Использование
Hostname
command Еще до появления PowerShell единственным интерпретатором команд Windows, который у нас был, был старый добрый cmd .exe . В то время нам не требовалась никакая вонючая оболочка PowerShell, чтобы получить имя компьютера; у нас была команда hostname
!
Команда hostname
не может быть проще. Откройте PowerShell (или даже командную строку cmd .exe) и введите hostname
. Выполнено. Эта команда возвращает одну строку (имя локального компьютера).
Использование
System.Net.DNS
.NET Class Если вы хотите использовать подход, более ориентированный на PowerShell, вы также можете сослаться на статический метод GetHostByName ()
, расположенный в классе System.Net.DNS
.NET или, возможно, на метод GetHostName ()
. .
GetHostName ()
Метод Использование метода GetHostName ()
, вероятно, является самым простым способом использования PowerShell для получения имени компьютера.Просто вызовите этот статический метод без аргументов, как показано ниже. Эта команда вернет одну строку, как и команда hostname
.
[System.Net.Dns] :: GetHostName ()
GetHostByName ()
Метод Альтернативный, но похожий метод класса System.Net.DNS
, который можно использовать для получения имени компьютера, называется GetHostByName ()
. Этот метод на самом деле является преобразователем DNS и может использоваться также для поиска имен других хостов.
Если, например, вы хотите найти имя хоста локального компьютера, запустите [System.NET.DNS] :: GetHostByName ($ null)
или [System.NET.DNS] :: GetHostByName ( '')
.
[System.Net.DNS] :: GetHostByName ('')
[System.Net.DNS] :: GetHostByName ($ Null)
Вы увидите, что этот метод не предназначен исключительно для поиска имен компьютеров; вы также можете искать IP-адреса через свойство AddressList
, как показано ниже.
Если, однако, вы хотите найти только имя локального компьютера; укажите свойство HostName
, и PowerShell вернет только имя хоста.
[System.Net.DNS] :: GetHostByName (''). HostName
[System.Net.DNS] :: GetHostByName ($ Null) .HostName
Использование переменных среды
Переменные среды — отличное место для поиска информации о компьютерах Windows; использование PowerShell для получения имени компьютера ничем не отличается.
Переменная среды ComputerName
На каждом компьютере с Windows хранится переменная среды с именем ComputerName
. Как и все другие переменные среды, вы можете получить доступ к переменным среды пользователя с помощью конструкции PowerShell $ env
.
Для ссылки на переменную среды COMPUTERNAME
откройте PowerShell и укажите перед именем переменной среды $ env:
. PowerShell вернет имя локального компьютера в виде одной строки.
$ env: ИМЯ КОМПЬЮТЕРА
Свойство MachineName
В качестве альтернативы, если по какой-либо причине пользовательская переменная среды COMPUTERNAME
не работает в вашей ситуации, вы также можете использовать свойство MachineName
, которое является частью.NET Environment
class.
Ссылка на свойство MachineName
в классе Environment
.NET, как показано ниже.
[Среда] :: MachineName
Использование WMI
Наконец, у вас всегда есть возможность войти в WMI или CIM. Вероятно, вам следует сделать это в последнюю очередь, поскольку это потребует самых накладных расходов, хотя и крошечных. Использование PowerShell для получения имени компьютера с помощью WMI лучше всего для запроса имен удаленных компьютеров.
Если вы хотите использовать WMI для запроса имени локального компьютера, используйте Get-CimInstance
для запроса класса Win32_ComputerSystem , как показано ниже. Поскольку Get-CimInstance
возвращает не имя компьютера, а объект, представляющий экземпляр CIM, ссылка на свойство Name
возвращает только имя компьютера.
Get-CimInstance -ClassName Win32_ComputerSystem
(Get-CimInstance -ClassName Win32_ComputerSystem) .Name
Win32_ComputerSystem ЗапросПоиск имен удаленных компьютеров
Возможно, вы управляете множеством компьютеров и вам нужно найти имя хоста для всех из них. Обычно имя хоста будет представлено в Active Directory (AD), если вы работаете в такой среде или собрано каким-либо другим инструментом управления активами. Но если это не так, вы всегда можете вернуться к PowerShell.
Чтобы использовать PowerShell для получения имен удаленных компьютеров, у вас есть два варианта. Вы можете заключить описанные выше методы в блок сценария PowerShell Remoting или использовать WMI.
Использование удаленного взаимодействия PowerShell
Вместо того, чтобы снова рассматривать каждый метод, описанный ранее в этом разделе, просто знайте это.Вы можете заключить любую локальную команду в блок сценария PowerShell Remoting.
Если, например, на удаленном компьютере включено удаленное взаимодействие PowerShell, вы можете поместить любой из вышеперечисленных методов внутрь блока сценария и выполнить этот блок сценария с помощью команды Invoke-Command
.
Предполагая, что у вас есть только IP-адрес и вам нужно найти имя хоста компьютера с IP-адресом 192. 168.1.2, и вы не находитесь в среде AD, вызовите Invoke-Command
, как показано ниже.
## Создайте объект pscredential для передачи в Invoke-Command
$ credential = Get-Credential
## Запускаем команду на удаленном компьютере
Invoke-Command -ComputerName 192.168.1.2 -ScriptBlock {[System.Net.Dns] :: GetHostName ()} -Credential $ credential
Если PowerShell Remoting смог подключиться к удаленному компьютеру, PowerShell вернет тот же результат, что и вы, если бы выполняли эту команду локально.
Использование WMI
Кроме того, вы также можете использовать WMI для использования PowerShell для получения имени компьютера без необходимости заключать команду в блок сценария.Процесс поиска имени удаленного компьютера почти такой же, как и на локальном; просто используйте параметр ComputerName
.
Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName 192.168. 1.2
(Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName 192.168.1.2) .Name
Get-CimInstance
требует аутентификации. Если вы работаете в среде AD, вам не нужно будет вводить учетные данные, как показано выше. Однако, если вы не работаете в среде AD, вам потребуется установить новый сеанс CIM с помощью командлета New-CimSession
, использовать Get-CimInstance
для использования этого сеанса, а затем удалить сеанс CIM самостоятельно.Ниже приведен фрагмент кода о том, как это сделать.
## Создание объекта PSCredential
$ credential = Get-Credential
## Подключитесь к удаленному компьютеру, передав кредиты и создайте удаленный сеанс
$ cimSession = New-CimSession -ComputerName 192.168.1.5 -Credential $ учетные данные
## Используйте сеанс для запроса WMI и ссылки на свойство Name
(Get-CimInstance -Session $ cimSession -ClassName Win32_ComputerSystem) .Name
Следующие шаги
Если вы прочитали все это руководство, теперь у вас есть почти все самые популярные способы использования PowerShell для получения имени компьютера. Хотя мы, вероятно, упустили гораздо больше, это все способы, которыми вы найдете эту задачу выполненной во многих сценариях.
Теперь, когда вы знаете, как выполнить эту задачу, попробуйте создать сценарий, который будет массово получать имена компьютеров с помощью цикла, возможно, через CSV или текстовый файл!
Получение имени компьютера в Powershell · Oscar Virot
Обновление 2015-07-03:
Итак, я получил два комментария от Пола Вигманса. В основном это было связано с тем, что функции предоставляли другое имя хоста и версию netbios.И что я упустил хорошую функцию. И я так привык к этому, поскольку Windows ограничивает имя компьютера Netbios 16 символами, где последний является зарезервированным символом, поэтому я забыл проверить более длинные версии.
Обновленный пост в блоге со всей красотой:
В прошлые выходные моя компания и несколько клиентов провели мероприятие в шведской деревне Оре. Чтобы перейти к делу, на мероприятии присутствовали оба докладчика из «Фабрики знаний», TrueSec и Microsoft. И во время презентации Брюса Пайетта я заметил, что он использовал имя хоста вместо $ env: computername, как я и другие использую.Поэтому я немного поговорил с ним об этом и решил написать об этом в блоге. Итак, мы обсудили несколько вариантов, в основном с использованием $ env, метода .NET и hostname.exe. Я тоже решил проверить скорость парой способов. Давайте начнем со скоростей и двинемся дальше.
Каковы тогда главные действующие лица в этой драме ?:
- Переменная среды
- путь процесса имени хоста
- Путь WMI / CIM
- .NET MachineName
- Вызов функции Kernel32
- .Функция NET GetHostName
Переменная среды
Первое и самое простое решение для большинства программистов — использовать $ env: computername. Это быстрый и эффективный способ сделать это. Но у него есть свои недостатки. Каждая часть $ env может быть перезаписана командой в вашем скрипте. Но это быстро и эффективно.
$ env: имя компьютера
имя хоста путь процесса
Windows поставляется с тем же двоичным кодом, что и в системах Linux, просто введите имя хоста, и система вернет имя компьютера. Это требует создания процесса, а не просто чтения информации. И как видите дает отличный пенальти.
hostname.exe
Путь WMI
Как и большинство вещей, это можно сделать с помощью WMI. WMI был предустановлен с Windows 2000 и был загружен до этого. В моей системе 1107 классов в пространстве имен по умолчанию root \ cimv2. WMI также доступен при запуске WinPE с помощью инструмента командной строки wimc. WMI использует CIM для доступа к данным, но с тех пор WMI более известен.
Get-WMIObject Win32_ComputerSystem | Select-Object -Expand Имя свойства
Способ CIM
Вы также можете использовать Get-CIMInstance для доступа к общей информационной модели, что также делает способ WMI. Так что это просто исключение посредников.
(Get-CIMInstance CIM_ComputerSystem). Имя
.NET MachineName
Вы можете использовать .NET, к которому легко получить доступ через PowerShell. Фактически все, что вам нужно, чтобы заключить класс в [скобки] и начать вызывать вещи. Это быстрое и хорошее решение.
[system.environment] :: MachineName
Запрос Kernel32.dll
Я написал об этом еще один пост, потому что он стал немного больше этой небольшой площади. Но если вкратце, можно вызвать kernel32.dll и запросить имя компьютера. Это сложнее, чем нужно, и не очень или совсем не улучшает скорость. Поэтому я бы посоветовал не использовать его.
.NET функция GetHostName
Это было предложено Полом.Он использует класс system.net.dns и его функцию gethostname.
[System.Net.Dns] :: GetHostName ()
Разные результаты
Как также указал Пол, я не особо заботился о компьютерных именах длиной более 15 символов, поскольку разные подходы дают разные результаты. Итак, это таблица того, что разные
Метод | Результат |
---|---|
Переменная среды | Имя компьютера NetBIOS |
имя хоста путь процесса | Полное имя компьютера |
Путь WMI / CIM | Имя компьютера NetBIOS |
.NET MachineName | Имя компьютера NetBIOS |
Вызов функции Kernel32 | Имя компьютера NetBIOS |
.NET функция GetHostName | Полное имя компьютера |
Тесты скорости
Итак, я пробежал каждый метод по 10000 раз и записал среднее время, которое это заняло. Некоторые способы (kernel32) действительно предвзято относятся, поскольку он не запоминает системное время выполнения между попытками.
Метод | Среднее количество тиков |
---|---|
.NET MachineName | 148 |
$ Конверт | 402 |
.Net GetHostName | 538 |
Ядро32 | 3306 |
WMI | 91361 |
имя хоста | 93548 |
CIM | 99398 |
Я планировал здесь диаграмму, но, поскольку у меня были только маленькие или большие значения, это выглядело плохо. Так что используйте свое воображение.
Как проверить себя.
1..10000 | % {measure-command {$ env: computername}} | Объект измерения -Средние тики
1..10000 | % {measure-command {hostname}} | Объект измерения - Среднее количество тиков
1..10000 | % {measure-command {(Get-WMIObject Win32_ComputerSystem) .Name}} | Объект измерения -Средние тики
1..10000 | % {measure-command {(Get-CIMInstance CIM_ComputerSystem) .Name}} | Объект измерения -Средние тики
1..10000 | % {Measure-Command {[system.environment] :: MachineName}} | Measure-Object -Средние тики
1..10000 | % {Measure-Command {Get-Kernel32ComputerName}} | Measure-Object -Средние тики
1..10000 | % {Measure-Command {[System.Net.Dns] :: GetHostName ()}} | Measure-Object - Среднее количество тиков
Заключение
Итак, во всех будущих сценариях я знаю, чего хочу, я хочу использовать .NET. Это просто, быстро и безопасно. То, что решение в основном встроено, является хорошей частью моих рассуждений. Я хотел бы получить Get-ComputerName, но я сам могу упростить эту часть, по крайней мере, пока мы не получим командлет от Microsoft.
Упрощение:
Просто превращаем [system.environment] :: MachineName
в нечто более элегантное и простое. Функция Get-VComputerName {[system.environment] :: MachineName}
Как переименовать компьютер с помощью PowerShell »Хорхе Бернхардт
В этом посте я хочу показать вам, как переименовать локальный или удаленный компьютер с помощью командлета PowerShell: Rename-Computer .
Чтобы переименовать компьютер с помощью PowerShell, используйте командлет Rename-Computer со следующим синтаксисом:
Переименовать-Computer -ComputerName
Rename-Computer -ComputerName -NewName -LocalCredential -DomainCredential -DomainCredential |
Для компьютеров, входящих в рабочую группу, запустите консоль PowerShell от имени администратора и введите:
Переименовать-Компьютер -Имя компьютера «Удаленный компьютер» -Новое имя «Новое имя» -Локальные учетные данные RemoteComputerAdminUser -Restart
Rename-Computer -ComputerName «RemoteComputer» -NewName «NewName» -LocalCredential RemoteComputerAdminUser -Restart |
Для компьютеров, находящихся в домене, введите PowerS, а затем введите консоль PowerS :
Rename-Computer -ComputerName «RemoteComputer» -NewName «NewName» -DomainCredential DomainAdminUser -Restart
Rename-Computer -ComputerName «RemoteComputer» -NewName «NewName» -DomainCredential DomainAdminUser -Restart |
Чтобы переименовать CSV-файл, можно использовать несколько компьютеров.
Формат, используемый в файле CSV:
Имя ВМ01, Имя ВМ-01 VMName02, VM-Name-02 VMName03, VM-Name-03 VMName04, VM-Name-04 VMName05, VM-Name-05
VMName01, VM-Name-01 VMName02, VM-Name-02 VMName03, VM-Name-03 VMName04, VM-Name-04 VMName-05 05 |
Вот простой сценарий, который позволяет переименовать несколько компьютеров, объявленных в файле CSV
# Переименовать-Компьютеры-CSV.ps1 # v0.1 # wwww.jorgebernhardt.com $ File = ‘c: \ scriptComputerList.csv’ $ Credential = Get-Credential $ computerList = Import-Csv -Path $ File ` -Delimiter «,» ` -Header OldName, NewName foreach ($ Computer в $ computerList) { Переименовать-Computer -ComputerName $ Computer.OldName ` -NewName $ Computer.NewName ` -DomainCredential $ Credential ` -Сила ` -Рестарт }
1 2 3 4 5 6 7 8 9 10 11 1617 18 19 20 21 22 | # Rename-Computers-CSV.ps1 # v0.1 # wwww.jorgebernhardt.com $ File = ‘c: \ scriptComputerList.csv’ $ Credential = Get-Credential -$ computersvist -Path $ File ` -Delimiter», «` -Header OldName, NewName foreach ($ Computer в $ computerList) { Rename-Computer -ComputerName $ Computer.OldName ` -NewName $ Computer.NewName` -DomainCredential $ Credential ` -Force` -Restart } |
Обходной путь на локальном компьютере находятся в рабочей группе, запустите консоль PowerShell от имени администратора и введите:
Rename-Computer -NewName «ComputerName» -LocalCredential localhostAdminUser -Restart
Rename-Computer -NewName «ComputerName» -LocalCredential localhostAdminUser -Restart |
, введите как администратор, а затем Rename-Computer -NewName «ComputerName» -DomainCredential DomainAdminUser -Restart
Rename-Computer -NewName «ComputerName» -DomainCredential DomainAdminUser -Restart |
Если вы хотите узнать больше о командлете Rename-Compute r, перейдите по этой ссылке: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/rename- компьютер? view = powershell-6
Была ли эта статья полезной? Поддержите мою работу!
Как управлять компьютерами в Active Directory с помощью PowerShell
Прежде чем пользователь сможет войти в компьютер и получить доступ к сетевым и доменным ресурсам, этот компьютер должен быть членом среды Active Directory.В этом руководстве вы узнаете, как автоматизировать повседневные задачи, связанные с учетными записями компьютеров, например, как легко создавать, переименовывать и удалять учетные записи.
В целом вы узнаете, как использовать PowerShell для выполнения следующих задач по управлению учетными записями компьютера:
- Присоедините компьютер к домену
- Присоединение нескольких компьютеров к домену
- Удаление компьютера из домена с помощью PowerShell
- Создание компьютерного объекта в AD
- Создание учетных записей компьютеров из файла CSV
- Удаление компьютера из AD
- Удаление учетных записей компьютеров с помощью списка
- Удаление устаревших учетных записей компьютеров в Active Directory с помощью PowerShell
- Переименовать компьютер
- Переименовать компьютер и присоединить его к домену
- Отключить учетную запись компьютера AD
- Отключить учетные записи компьютеров с помощью списка
- Сброс учетной записи компьютера AD
PowerShell ISE — лучший инструмент для работы со скриптами PowerShell.Запустите инструмент PowerShell ISE с правами администратора, нажав «Windows + R» и введя «runas / profile / user: Administrator PowerShell_ISE» в окне «Выполнить». (Кроме того, вы можете щелкнуть правой кнопкой мыши значок PowerShell ISE и выбрать параметр «Запуск от имени администратора».) Введите пароль администратора, когда будет предложено.
Прежде чем вы сможете работать с AD и его объектами, вам необходимо импортировать модуль Active Directory для Windows PowerShell. В Microsoft Windows Server 2008 R2 вам необходимо включить этот модуль, выполнив следующую команду:
Импорт-модуль ActiveDirectory
В Microsoft Windows Server 2012 и более поздних версиях этот модуль включен по умолчанию.
Присоедините компьютер к доменуСамая распространенная задача — присоединить компьютер к контроллеру домена. Чтобы присоединить компьютер к домену Active Directory, запустите локально следующий сценарий PowerShell:
$ dc = "ENTERPRISE" # Укажите домен для присоединения. $ pw = "Пароль123" | ConvertTo-SecureString -asPlainText –Force # Укажите пароль для администратора домена. $ usr = "$ dc \ T.Simpson" # Укажите учетную запись администратора домена. $ creds = Система новых объектов.Management.Automation.PSCredential ($ usr, $ pw) Add-Computer -DomainName $ dc -Credential $ creds -restart -force -verbose # Обратите внимание, что компьютер будет перезагружен автоматически.
Компьютер перезагрузится и присоединится к домену; он будет добавлен в контейнер по умолчанию.
Для удаленного подключения компьютера к контроллеру домена необходимо улучшить этот сценарий следующим образом:
$ dc = "ПРЕДПРИЯТИЕ" $ pw = "Пароль123" | ConvertTo-SecureString -asPlainText -Force $ usr = "$ dc \ T.Симпсон " $ pc = "R07GF" # Укажите компьютер, который следует присоединить к домену. $ creds = Новый объект System.Management.Automation.PSCredential ($ usr, $ pw) Add-Computer -ComputerName $ pc -LocalCredential $ pc \ admin -DomainName $ dc -Credential $ creds -Verbose -Restart -Force
Переменная $ pc и параметр –LocalCredential используются для аутентификации компьютера в домене. Обратите внимание, что для использования этого метода необходимо отключить брандмауэр на локальном компьютере.
Присоедините несколько компьютеров к домену
В домен можно добавить несколько компьютеров, указав их в командной строке в виде списка с разделителями-запятыми или импортировав их имена из текстового файла.
Вот как указать компьютеры в списке с разделителями-запятыми:
$ dc = "ПРЕДПРИЯТИЕ" $ pw = "Пароль123" | ConvertTo-SecureString -asPlainText -Force $ usr = "$ dc \ T.Simpson" $ pc = "WKS034, WKS052, WKS057" # Укажите компьютеры, которые должны быть присоединены к домену.$ creds = Новый объект System.Management.Automation.PSCredential ($ usr $ pw) Add-Computer -ComputerName $ pc -LocalCredential $ pc \ admin -DomainName $ dc -Credential $ creds -Restart -Force
А вот как использовать текстовый файл со списком компьютеров, которые нужно объединить:
$ dc = "ПРЕДПРИЯТИЕ" $ pw = "Пароль123" | ConvertTo-SecureString -asPlainText -Force $ usr = "$ dc \ T.Simpson" $ pc = Get-Content -Path C: \ Computers.txt # Укажите путь к списку компьютеров.$ creds = Новый объект System.Management.Automation.PSCredential ($ usr, $ pw) Add-Computer -ComputerName $ pc -LocalCredential $ pc \ admin -DomainName $ dc -Credential $ creds -Restart -ForceУдаление компьютера из домена с помощью PowerShell
Для удаленного удаления компьютера из домена используйте командлет Remove-Computer . Здесь мы удаляем компьютер из домена, поэтому локальные учетные данные не требуются, и мы можем пропустить параметр ? LocalCredential :
$ dc = "ПРЕДПРИЯТИЕ" $ pw = "Пароль123" | ConvertTo-SecureString -asPlainText -Force $ usr = "$ dc \ T.Симпсон " $ pc = "R07GF" $ creds = Новый объект System.Management.Automation.PSCredential ($ usr, $ pw) Remove-Computer -ComputerName $ pc -Credential $ creds –Verbose –Restart –Force
Чтобы удалить несколько компьютеров с помощью списка в файле TXT, используйте приведенный выше сценарий для присоединения компьютеров к контроллеру домена, заменив командлет Add-Computer на Remove-Computer. Обратите внимание, что вам все равно потребуются учетные данные администратора домена для завершения этой операции отмены присоединения.
Создание компьютерного объекта в ADЧтобы создать объект-компьютер, используйте командлет New-ADComputer .Например, выполните следующие параметры командлета, чтобы создать объект компьютера с именем «WKS932» и значением пути LDAP по умолчанию:
New-ADComputer - имя «WKS932» - имя SamAccountName «WKS932»
Создание учетных записей компьютеров из файла CSV
Если у вас есть список компьютеров, которые следует импортировать в Active Directory, сохраните список в CSV-файл с заголовком «компьютер» и списком имен компьютеров в столбце под ним. Запустите следующий сценарий PowerShell на контроллере домена, чтобы добавить компьютеры из файла CSV, убедившись, что у вас правильно установлены переменные «Путь» и «Файл»:
$ File = "C: \ scripts \ Computers.csv "# Укажите позицию импорта CSV. $ Path = "OU = Devices, DC = enterprise, DC = com" # Укажите путь к OU. Import-CSV -Path $ File | ForEach-Object {New-ADComputer -Name $ _. Computer -Path $ Path -Enabled $ True}Удаление компьютера из AD
Чтобы удалить учетную запись компьютера из AD, используйте командлет Remove-ADObject . Параметр -Identity указывает, какой компьютер Active Directory нужно удалить. Вы можете указать компьютер по его отличительному имени, GUID, идентификатору безопасности (SID) или имени учетной записи диспетчера учетных записей безопасности (SAM).
Remove-ADObject -Identity "WKS932"
Вам будет предложено подтвердить удаление.
Удаление учетных записей компьютеров с помощью списка
Если у вас есть текстовый файл со списком старых компьютеров, вы можете упростить задачу их удаления с помощью PowerShell. Следующий сценарий считывает имена компьютеров из файла TXT и удаляет соответствующие учетные записи с помощью цепочки команд или конвейера:
Get-Content C: \ scripts \ computersfordeletion.txt | % {Get-ADComputer -Filter {Name -eq $ _}} | Remove-ADObject -Recursive
Удаление устаревших учетных записей компьютеров из Active Directory с помощью PowerShell
Устаревшие учетные записи в Active Directory могут быть скомпрометированы, что приведет к нарушениям безопасности, поэтому очень важно следить за ними.Этот сценарий PowerShell будет запрашивать Active Directory и возвращать все компьютеры, на которых не выполнялся вход в течение последних 30 дней; вы можете легко изменить это значение по умолчанию в скрипте. Он также удалит эти учетные записи, чтобы ваша AD оставалась чистой.
$ stale = (Get-Date) .AddDays (-30) # означает 30 дней с момента последнего входа в систему, может быть изменено на любое число. Get-ADComputer -Property Name, lastLogonDate -Filter {lastLogonDate -lt $ stale} | Имя FT, lastLogonDate Get-ADComputer -Property Name, lastLogonDate -Filter {lastLogonDate -lt $ stale} | Удалить-ADComputer
Есть один компьютер, FS1, к которому не входили более 30 дней.Система запросит подтверждение перед удалением из домена:
Если вы хотите отключить, а не удалить неактивные учетные записи компьютеров, замените командлет Remove-ADComputer на параметр и значение Set-ADComputer и -Enabled $ false .
Переименовать компьютерЧтобы изменить имя компьютера, используйте командлет Rename-Computer . Обратите внимание, что компьютер должен быть в сети и подключен к Active Directory.
Переименовать-Компьютер - Имя компьютера "FS1" -Новое имя "FS2"
Если вы хотите запустить этот сценарий локально, он будет выглядеть так:
Rename-Computer -NewName "newname" -DomainCredential "Domain \ Administrator"
Переименовать компьютер и присоединить его к домену
Вы можете улучшить сценарий переименования, присоединив компьютер к домену и одновременно поместив его в указанное подразделение. Сценарий следует запускать на целевой машине, а не на контроллере домена.
$ NewComputerName = "Server3" # Укажите новое имя компьютера. $ DC = "contoso.com" # Укажите домен, к которому нужно присоединиться. $ Path = "OU = TestOU, DC = contoso, DC = com" # Укажите путь к OU, в которое поместить учетную запись компьютера в домене.
Add-Computer -DomainName $ DC -OUPath $ Path -NewName $ NewComputerName –Restart –Force
Сценарий запросит учетные данные учетной записи, имеющей разрешения на присоединение компьютеров к домену, а затем компьютер будет переименован, перезагружен и присоединен к домену.
Отключить учетную запись компьютера ADИспользуйте командлет Disable-ADAccount для отключения учетных записей пользователей, компьютеров и служб Active Directory. Если вы указываете имя учетной записи компьютера, не забудьте добавить знак доллара ($) в конце имени; в противном случае после выполнения скрипта вы получите сообщение об ошибке.
Disable-ADAccount -Identity fs1долларов США
Отключить учетные записи компьютеров с помощью списка
Вы также можете массово отключить учетные записи компьютеров, используя список в текстовом файле:
$ Pclist = Получить содержимое C: \ scripts \ Computer.txt # Укажите путь к списку компьютеров. Foreach ($ pc в $ Pclist) { Disable-ADAccount -Identity "$ pc" Get-ADComputer -Identity "$ pc" | Move-ADObject -TargetPath «OU = Disabled Computers, DC = enterprise, DC = com» }Сброс учетной записи компьютера AD
Как и учетная запись пользователя, учетная запись компьютера взаимодействует с Active Directory с помощью пароля. Но для учетных записей компьютеров смена пароля по умолчанию инициируется каждые 30 дней, и пароль исключен из политики паролей домена.Изменение пароля осуществляется клиентом (компьютером), а не AD.
Учетные данные компьютера обычно неизвестны пользователю, поскольку они устанавливаются компьютером случайным образом. Но вы можете установить свой собственный пароль; вот сценарий PowerShell для этого:
$ pc = read-host –Prompt «Введите имя компьютера для сброса» # Укажите имя компьютера. $ pw = read-host –Prompt «Введите случайные символы для временного пароля» –AsSecureString # Укажите пароль. Get-ADComputer $ pc | Set-ADAccountPassword –NewPassword: $ pw -Reset: $ true
Заключение
Теперь вы узнали, как управлять учетными записями компьютеров Active Directory с помощью PowerShell.Вы можете улучшить все эти скрипты самостоятельно, чтобы они соответствовали вашим целям.
Помните, что очень важно внимательно отслеживать все изменения в учетных записях компьютеров, чтобы вы могли быстро обнаружить любые нежелательные изменения и отреагировать соответствующим образом.
Джефф — бывший директор по разработке глобальных решений в Netwrix.Он давний блоггер Netwrix, спикер и ведущий. В блоге Netwrix Джефф делится лайфхаками, советами и приемами, которые могут значительно улучшить ваш опыт системного администрирования.
Hostname = ComputerName? Я не прав! | у реки Ян | River Yang
До Windows Server 2016 я думал, что они не совпадают по следующим причинам:
- hostname — это exe-оболочка от MS, она возвращает полное имя компьютера, даже если оно превышает 15 символов
- $ env : computername — это переменная в PowerShell, она возвращает NetBIOSComputername, которое ограничено 15 символами
Но сегодня я ошибаюсь….
Среда:
- Хост контейнера: Docker01-Gui
- Имя контейнера:
Используя следующую команду:
Write-Host '$ env: computername:' $ env: computername
$ hostname = hostname
Write- Хост 'hostname.exe:' $ hostname
$ w32compsys = Get-WMIObject Win32_ComputerSystem | Select-Object -ExpandProperty name
Write-Host 'Get-WMIObject Win32_ComputerSystem | Select-Object -ExpandProperty name: '$ w32compsys
Write-Host' (Get-CIMInstance CIM_ComputerSystem).Имя: '(Get-CIMInstance CIM_ComputerSystem) .Name
$ machinename = [system.environment] :: MachineName
Write-Host' [system.environment] :: MachineName: '$ machinename
$ dnsname = [System.Net.Dns ] :: GetHostName ()
Write-Host '[System.Net.Dns] :: GetHostName ():' $ dnsname
Мы получили результат в Container Host:
$ env: computername: DOCKER01-GUI
hostname.exe : Docker01-Gui
Get-WMIObject Win32_ComputerSystem | Select-Object -ExpandProperty name: DOCKER01-GUI
(Get-CIMInstance CIM_ComputerSystem).Имя: DOCKER01-GUI
[system.environment] :: MachineName: DOCKER01-GUI
[System.Net.Dns] :: GetHostName (): Docker01-Gui
Мы получили результат в самом контейнере:
$ env: computername : WIN-E2ABUUD2V1V
hostname.exe: Docker01-Gui
Get-WMIObject Win32_ComputerSystem | Select-Object -ExpandProperty name: WIN-E2ABUUD2V1V
(Get-CIMInstance CIM_ComputerSystem) .Name: WIN-E2ABUUD2V1V
[system.environment] :: MachineName: WIN-E2ABUUD2V1V
:: [System.Host.Dnsame] (Get-CIMInstance CIM_ComputerSystem). Docker01-Gui
Как мы видим выше, «hostname.exe »и« [System.Net.Dns] :: GetHostName () »возвращают имя хоста контейнера, которое не является реальным значением, которое, я думаю, должно быть…
Я не уверен, является ли это ожидаемым значением или ошибка, но в любом случае я собираюсь использовать $ env: computername для получения локального имени компьютера в будущем.
Как насчет вас?
Как узнать версию ОС Windows с помощью PowerShell
Для устранения неполадок или перед развертыванием любого программного обеспечения полезно знать, какая версия операционной системы Windows работает в настоящее время.Мы можем легко найти сведения об ОС в свойствах «Мой компьютер», но если вы хотите получить сведения со своего компьютера клиента для устранения каких-либо проблем, PowerShell — лучший вариант для получения всех необходимых сведений о компьютере.
В PowerShell мы можем найти сведения об операционной системе разными способами, но для большей безопасности мы можем использовать командлет на основе WMI Get-WmiObject , эта команда совместима с Windows PowerShell 2.0. Используя эту команду, мы можем запросить WMI-класс Win32_OperatingSystem , чтобы получить номер версии ОС:
(Get-WmiObject Win32_OperatingSystem).Версия
Приведенная выше команда возвращает только номер версии ОС. Выполните следующую команду, чтобы получить отображаемое имя вашей версии Windows.
(Get-WmiObject Win32_OperatingSystem). Заголовок Выход : Microsoft Windows 7 Максимальная
Мы можем использовать команду select, чтобы получить вывод всех необходимых свойств, связанных с ОС.
Get-WmiObject Win32_OperatingSystem | Выберите PSComputerName, Caption, OSArchitecture, Version, BuildNumber | FL
Мы можем использовать командлет Get-WmiObject в краткой форме gwmi .
(gwmi win32_operatingsystem) .caption
Получить версию ОС удаленного компьютера
Мы можем легко получить сведения о версии ОС удаленного компьютера, добавив параметр -ComputerName в Get-WmiObject.
Get-WmiObject Win32_OperatingSystem -ComputerName "Remote_Machine_Name" | Выберите PSComputerName, Caption, OSArchitecture, Version, BuildNumber | FL
Получить сведения об ОС для списка удаленных компьютеров с помощью PowerShell
Вы можете использовать следующий сценарий PowerShell, чтобы найти сведения о версии ОС для нескольких удаленных компьютеров.Сначала создайте текстовый файл с именем computers.txt , содержащий по одному имени компьютера в каждой строке. Вы получите вывод имени машины, имени ОС и номера версии в файле csv OS_Details.csv .
Get-Content «C: \ computers.txt» | ForEach-Object { $ os_name = $ null $ os_version = $ null $ errorMsg = '' Пытаться { $ os_name = (Get-WmiObject Win32_OperatingSystem -ComputerName $ _) .Caption } ловить { $ errorMsg = $ _. Exception.Message } if (! $ os_name) { $ os_name = "Машина недоступна $ errorMsg" $ os_version = "Машина недоступна" } еще{ $ os_version = (Get-WmiObject Win32_OperatingSystem -ComputerName $ _).Версия } Новый объект -TypeName PSObject -Property @ { ComputerName = $ _ OSName = $ os_name OSVersion = $ os_version }} | Выберите ComputerName, OSName, OSVersion | Экспорт-CSV "C: \ OS_Details.csv" -NoTypeInformation -Encoding UTF8
Указание имени компьютера и параметров учетных данных
При создании пользовательских сценариев вы указываете целевой тип в метаданных сценария. При написании сценария помните о целевом типе. При написании сценария в первую очередь следует учитывать, следует ли включать в команды параметры ComputerName и Credential.Среда ITScripts предоставляет имя компьютера в переменной ST_ComputerName и учетные данные для этого компьютера в переменной ST_Credential. Например, при написании сценария с целевым типом «Любой» вы можете указать эту команду:
Get-WmiObject win32_Share -ComputerName $ ST_ComputerName -Credential $ ST_Credential
Однако эта команда завершится ошибкой, если будет запущена на локальном компьютере со следующей ошибкой:
Get-WmiObject: учетные данные пользователя не могут использоваться для локальных подключений
Другими словами, эта команда будет работать, если целевой тип — «Любой», а целевая машина не является консолью, но завершится ошибкой в следующих случаях:
• Тип цели — «Консоль»
• Тип цели — WinRM Remoting
• Тип цели — «Любой», цель — консольный компьютер
.Чтобы учесть эти случаи, вашему сценарию может потребоваться проверить, использует ли он удаленное взаимодействие или целью является консольный компьютер.Чтобы упростить создание сценария, ITScripts предоставляет две функции: ST-ComputerAndCredential и ST-SubCC .
ST-ComputerAndCredential
Эта функция возвращает строку, содержащую соответствующую строку для использования в
-ComputerName и -Credential параметры в зависимости от типа сценария, от того, выполняется ли он на консоли и были ли предоставлены учетные данные для машины. Он вернет одну из этих строк:
«-ComputerName $ ST_ComputerName –Credential $ ST_Credential»
«-ComputerName $ ST_ComputerName»
«»
Вы можете использовать это в своей команде сценария, не заботясь о среде, в которой вы выполняете.Например:
$ cc = ST-ComputerAndCredential
$ share = Invoke-Expression «Get-WmiObject win32_Share $ cc»
Invoke-Expression используется для замены значения $ cc перед выполнением команды. Проблема с этой конструкцией заключается в том, что вы должны не забывать экранировать специальные символы в вашей команде. Например, символы «$» и кавычки необходимо экранировать в следующей команде:
$ ST_CC = ST-ComputerAndCredential
$ registryObject = Invoke-Expression «Get-WmiObject -list
-пространство имен root \ default $ ST_CC |
где-объект {`$ _.name -eq `» StdRegProv` «}»
Следующая функция делает это еще проще.
ST-SubCC
Эта функция объединяет две команды, показанные в предыдущем примере. При первом вызове он помещает результат ST-ComputerAndCredential в переменную PowerShell с именем ST_CC. Затем он передает полученную команду в Invoke-Expression. При использовании ST_SubCC следует помнить, что команду следует помещать в одинарные кавычки, а не в двойные. Предыдущие примеры:
$ акций = ST-SubCC ‘Get-WmiObject win32_Share $ ST_CC’
$ registryObject = ST-SubCC ‘Get-WmiObject -list
-пространство имен root \ default $ ST_CC |
где-объект {$ _.