Я получаю следующую ошибку, Ошибки поймали — TRAPPED: System.Management.Automation.RemoteException с сообщением TRAPPED: термин «D:ServiceNowRDC- Dev-AllagentscriptsPowerShellImMigration_script.ps1» не распознается как имя командлета, функция, скрипт fil e или исполняемая программа. Проверьте правильность написания имени или, если включен путь, убедитесь, что путь правильный и снова. Проблема связана с командой invoke-command
Invoke-Command -Session $Session -ScriptBlock $theCommand2
Я устал использовать -FilePath без везения. Также устал передавать команду и параметр отдельно:
Invoke-Command -Session $Session -ScriptBlock $theCommand2 -argumentlist $leName
Я запускаю сценарий, используя:
D:ServiceNowRDC-Dev-AllagentscriptsPowerShellinvokLyncUAdd.ps1 -param1 ‘CN=lync2013testuser1,CN=Users,DC=test,DC=COMPANY,DC=com’ -param2 ADsys-LyncProATSC -param3 Z0185-XAP0007-S.test.COMPANY.com
param( $param1, $param2, $param3 )
$ErrorActionPreference = «Stop»
Use the correct PowerShell in Visual Studio Code
# trap # write-output $(«TRAPPED: » + $_.Exception.GetType().FullName);
# write-output $(«TRAPPED: » + $_.Exception.Message);
# break
#>
$leName = $param1
$leName = («‘» + «$leName» + «‘»)
$thePath = ‘D:ServiceNowRDC-Dev-AllagentscriptsPowerShell’
$theCommand = $thePath+»ImMigration_script.ps1 -param1 $leName»
$theCommand2 = [Scriptblock]::Create($theCommand)
# Write-Host «We use string $theCommand below»
$Account = $param2
$useP = Get-Content $thePath’Information.txt’
$Prompt = convertto-securestring $useP -AsPlainText -Force
$leHost = $param3
try
$Credential = new-object -typename System.Management.Automation.PSCredential
-argumentlist $Account, $Prompt
$Timeout = New-PSSessionOption -IdleTimeout 60000
$Session = New-PSSession -ComputerName $leHost -Credential $Credential —
Authentication Credssp -SessionOption $Timeout -ErrorAction Stop
Invoke-Command -Session $Session -ScriptBlock $theCommand2
>
catch
$exceptType = $(«TRAPPED: » + $_.Exception.GetType().FullName);
$exceptMess = $(«TRAPPED: » + $_.Exception.Message);
>
finally
if($exceptType) < «Errors caught — $exceptType with message $exceptMess » >>
Любая помощь будет замечательной, спасибо
спросил(а) 2017-06-19T18:20:00+03:00 6 лет назад
Источник: progi.pro
Некоторые особенности PowerShell при работе с учетными записями пользователей
Я считал, что неплохо разбираюсь в powershell, но мне никогда не приходилось работать с учетными данными пользователей. Однако сейчас я в поиске работы и на одном из собеседований мне поставили тестовое задание написать скрипт, который должен был:
Как пользоваться ADB из Windows PowerShell?
- Проверить наличие и статус (включена/отключена) учетной записи пользователя.
- Проверить включена ли учетная запись в группу «Администраторы»
- Если учетная запись отсутствует, то создать учетную запись и добавить ее в группу администраторы, проставить флаги «Запретить смену пароля пользователем» и «Срок действия пароля не ограничен»
- Если учетная запись существует, но отключена либо не входит в группу «Администраторы», то включить учетную запись и добавить ее в группу «Администраторы», проставить флаги «Запретить смену пароля пользователем» и «Срок действия пароля не ограничен»
- Скрипт не должен зависеть от языка операционной системы.
Get-User admin
И тут же получил ошибку
Get-User : Имя «Get-User» не распознано как имя командлета, функции, файла сценария или выполняемой программы.
Немного опешив, от того, что такая полезная команда и не распознала я погуглил и обнаружил, что команда Get-User работает только в консоли Powershell для Exchange. Для работы с локальными пользователями необходимо использовать Get-Localuser, а для доменных Get-Aduser. Осознав свою ошибку, я вбил:
Get-Localuser admin
И получил ответ
Name Enabled Description —- ——- ———— Admin True Встроенная учетная запись администратора компьютера/домена
Ну теперь проверить есть пользователь или нет, не составит большого труда, однако и тут меня ждал очередной подвох. Через условный оператор if else сделать это оказалось не так-то просто.
Дело в том, что если пользователь есть в системе, то на выход мы получаем не значение true, а целый набор данных, с именем, описанием пользователя, включена эта учетная запись или нет. А если пользователя нет, то powershell выдает ошибку. Побродив по просторам интернета, я обнаружил, что для этих целей лучше использовать оператор try сatch.
$user = ‘admin’ try < Get-LocalUser $user -ErrorAction Stop | Out-Null write-host пользователь $user есть -foregroundcolor Green >Catch
Я добавил переменную $user, чтобы было проще менять имена пользователя во всем скрипте. ErrorAction Stop необходим, чтобы скрипт не прервался на этом шаге из-за ошибки. Знак | разделяет шаги конвейера, а Out-Null скроет вывод текста ошибки. Так же я добавил вывод текста с подсветкой, для удобства проверки скрипта.
Далее я захотел проверить, включена или отключена учетная запись. Как я уже говорил, команда Get-LocalUser выдает целый набор данных и для проверки, мне нужно было выделить только один параметр Enabled со значением true или false. Для этого я воспользовался следующей командой:
(Get-LocalUser $user).enabled
Убедившись, что он работает, я сделал следующую проверку и добавил команду включения пользователя.
$user = ‘admin’ if ((Get-LocalUser $user).enabled -eq «True») < write-host учетная запись включена -foregroundcolor Green >else
Для включения пользователя, естественно необходимо запускать консоль под правами администратора.
Во втором пункте задания, необходимо было определить входит ли пользователь в группу администраторов. Для проверки наличия пользователя в той или иной группе есть команда Get-LocalGroupMember. Однако имя группы администраторов, меняется от языка операционной системы. Поэтому мне пришлось воспользоваться стандартным SID S-1-5-32-544. Проверку я также сделал через try сatch.
$user = ‘admin’ try < Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host пользователь $user состоит в группе администраторы -foregroundcolor Green >Catch
В случае, если пользователь не состоит в группе, администраторов он будет в нее добавлен.
На следующем этапе, у меня стояла задача определить отключена настройка смены пароля у пользователя или нет. Тут я наткнулся на очередные подводные камни. Дело в том, что если у пользователя, срок действия пароля не ограничен, то параметр PasswordExpires не выдает никаких значений. А если эта галочка отключена, то у разных пользователей будет стоять разная дата смены пароля. Выход из этого положения я всё-таки придумал:
if ((Get-LocalUser $user).PasswordExpires -eq $null) < write-host срок действия паролья не ограничен -foregroundcolor Green >else
Дальше мне было необходимо создавать пользователя. Я никак не ожидал, что и здесь меня может ждать подвох. При создании пользователя командой
Дело в том, что параметр -password должен использовать SecureString, вместо обычной текстовой строки. Для этого я сделал переменную $password и сконвертировал её в securestring.
А сам скрипт по созданию пользователя и добавления его в группу администраторов
new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user
Готовый скрипт учитывающий все условия у меня получился таким образом:
Однако хранение пароля администратора в скрипте — это не лучшая практика с точки зрения безопасности. Для этого можно использовать хэш пароля, а не сам пароль.
$user = ‘admin1’ $hash = «01000000d08c9ddf0115d1118c7a00c04fc297eb0100000048baf1b47a72d845b4eeda8659da9fd70000000002000000000010660000000100002000000004d2a3bf03aac92c2e172dc002d1fe8759da4655850462aface5c25f52921e05000000000e8000000002000020000000bfa652b6f7cc6845e3cee1831b54ab93dc272d0b2203024c3de8bc4789a2698a10000000923fb50dcf01125913534d0c1ba6d827400000002757df7d8a8b39c8e84b81323acff1d72419580a0022cf610926e5f081a2e895320088d482eb407f8157aad82f091abee7427b357e871d12238a8f74131238e7» $hash $password = ConvertTo-SecureString -String $hash $password new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user
Для того, чтобы получить хэш пароля можно воспользоваться следующим скриптом
$Secure = Read-Host -AsSecureString $Secure $hash = ConvertFrom-SecureString -SecureString $Secure $hash
Который запросит ввод пароля с клавиатуры.
И маленький бонус для вывода всех отключенных записей
Get-LocalUser | Where-Object
Надеюсь, потраченное мною время поможет кому-то в работе. Да и для себя будет полезно не забыть этот бесценный опыт.
Источник: habr.com
Не распознано как имя командлета функции файла сценария или выполняемой программы powershell
Что бы ассоциировать скрипты с PowerShell, аналогично выполнению .bat/.cmd-файлов
нужно в командной строке набрать следующую команду(ы)
Версии 1.0-5.1 для 32-битных ОС: ftype microsoft.powershellscript.1=%windir%system32windowspowershellv1.0powershell.exe -file «%1»
%*
Версии 1.0-5.1 для 32-битных ОС: ftype microsoft.powershellscript.1=%windir%sysWOW64windowspowershellv1.0powershell.exe -file «%1»
%*
Версия 6.0 дя 32-битной ОС: ftype microsoft.powershellscript.1=»C:Program Files (86)PowerShell6.0.0pwsh.exe» -file «%1» %*
Версия 6.0 дя 64-битной ОС: ftype microsoft.powershellscript.1=»C:Program FilesPowerShell6.0.0pwsh.exe» -file «%1» %*
вопрос о подписи скриптов
Что бы PowerShell не задавал вопрос о том, что скрипты не подписаны, ввести в нем команду
set-executionpolicy unrestricted
или в командной строке
powershell Set-ExecutionPolicy Unrestricted -force
(для этих 2-х действий требуются административные права)
Прочее
- Если используете «белый список» в брандмауэре Windows, то для работы сценариев в сети необходимо создать 2 исходящих правила для svchost.exe и PowerShell.exe.
- В отличие от батников кодировка скриптов на PowerShell должна быть 1251 (ANSI)
Нужна команда Invoke-WebRequest.
Прийдется выкручиваться так:
Код:
$url = «http://www.astronomy.ru/forum/index.php» $ie = New-Object -ComObject InternetExplorer.Application $ie.Navigate($URL) while($ie.Busy) $ie.Document.getElementsByTagName(«td») | Where classname -eq lastpost $ie.Quit() |
т.е. к примеру есть запрос:
Как его с имитировать в PS со всеми headers, и продолжить работать с данным объектом, т.е. затем отправить POST запрос, сохранить coocks и т.д.
Столкнулся с непоняткой почему так
Get-ClusterNode | Get-ClusterResource | ?
Код:
Name State Group ResourceType —- —— —— ———— Virtual Machine DC-01-UK-TRM-01 Online DC-01-UK-TRM-01 Virtual Machine Virtual Machine DC-01-UK-TRM-02 Online DC-01-UK-TRM-02 Virtual Machine Virtual Machine DC-01-UK-APP-01 Online DC-01-UK-APP-01 Virtual Machine Virtual Machine DC-01-UK-SQL-01 Online DC-01-UK-SQL-01 Virtual Machine Virtual Machine DC-01-UK-APP-03 Online DC-01-UK-APP-03 Virtual Machine Virtual Machine DC-01-UK-SQL-02 Online DC-01-UK-SQL-02 Virtual Machine Virtual Machine DC-01-UK-TRM-03 Online DC-01-UK-TRM-03 Virtual Machine |
выдаёт список из 6 виртуалок, а вот так.
. кoтoрый в зaдaннoй пaпкe |»пaрaмeтр cкриптa»| и пoдпaпкaх ищeт фaйлы *.txt, и, ecли рaзмeр фaйлa бoльшe 200 Кб или дaтa пocлeднeгo измeнeния более 60 днeй, пeрeмeщaeт eгo в oтдeльную пaпку |»втoрoй пaрaмeтр cкриптa»|.
Cкрипт дoлжeн лoгирoвaть прoизвeдeнныe дeйcтвия в log.txt
Также при перемещении файлов необходимо обеспечить уникальность имен файлoв.
Добавлено:
Kakazabr
Честно говоря лень скрипт писать.
Get-Help Get-Item -Examples и Get-Help Get-ChildItem -Examples тебе в помощь.
На 13й странице темы мне объясняли как параметры для скрипта прописывать.
Код:
function get-CUserADGroups < $user=[System.Security.Principal.WindowsIdentity]::GetCurrent() $groups=$user.groups.Translate([System.Security.Principal.NTAccount]) $userdomain=$user.name.Split(«»)[0] $domaingroups=»» $groups | % < $_.value -match «^s*$userdomain\(.+)» | Out-Null; $Matches[1]; $Matches.Clear() > > |
Цитата:
. кoтoрый в зaдaннoй пaпкe |»пaрaмeтр cкриптa»| и пoдпaпкaх ищeт фaйлы *.txt, и, ecли рaзмeр фaйлa бoльшe 200 Кб или дaтa пocлeднeгo измeнeния более 60 днeй, пeрeмeщaeт eгo в oтдeльную пaпку |»втoрoй пaрaмeтр cкриптa»|. Cкрипт дoлжeн лoгирoвaть прoизвeдeнныe дeйcтвия в log.txt Также при перемещении файлов необходимо обеспечить уникальность имен файлoв. |
Уникальность обеспечивается за суффикса из текущего времени.
2.Еще интересней — такой код не работает хотя по описанию командлета должно работать
С параметром -Path работает.
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
Источник: forum.ru-board.com