Скрипт Powershell не работает должным образом в качестве запланированной задачи в Windows 2008. Не работает windows powershell


windows - Powershell script не запускается через запланированные задачи

У меня есть небольшой script на моем контроллере домена, который настроен для отправки по электронной почте мне через SMTP о последнем событии безопасности 4740.

script, когда выполняется вручную, будет запускаться по назначению; однако при настройке для запуска с помощью запланированных задач и, несмотря на то, что он показывает, что был выполнен, ничего не происходит (нет электронной почты).

script выглядит следующим образом:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { $arguments = "& '" + $myinvocation.mycommand.definition + "'" Start-Process powershell -Verb runAs -ArgumentList $arguments Break } $Event = Get-EventLog -LogName Security -InstanceId 4740 -Newest 5 $MailBody= $Event.Message + "`r`n`t" + $Event.TimeGenerated $MailSubject= "Security Event 4740 - Detected" $SmtpClient = New-Object system.net.mail.smtpClient $SmtpClient.host = "smtp.domain.com" $MailMessage = New-Object system.net.mail.mailmessage $MailMessage.from = "[email protected]" $MailMessage.To.add("toemail.domain.com") $MailMessage.IsBodyHtml = 1 $MailMessage.Subject = $MailSubject $MailMessage.Body = $MailBody $SmtpClient.Send($MailMessage)

Запланированная задача настраивается следующим образом:

RunsAs:LOCAL SYSTEM Trigger: On event - Log: Security, Event ID: 4740 Action: Start Program - C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe Argument: -executionpolicy bypass c:\path\event4740.ps1

Я также пробовал следующее:

Trigger: On event - Log: Security, Event ID: 4740 Action: Start Program - C:\path\event4740.ps1

В соответствии с историей задач: начатой ​​задачей, начатым действием, созданным процессом задачи, завершенным действием, завершенной задаче. Я просмотрел несколько ссылок на сайте с той же "проблемой", но все они, похоже, имеют какую-то переменную, которой у меня нет. Я также пробовал некоторые из упомянутых решений, думая, что они могут быть несколько связаны, но, увы, ничего не работает. Я даже попытался удалить мою запланированную задачу и сбросить ее, как указано здесь: http://blogs.technet.com/b/heyscriptingguy/archive/2012/08/11/weekend-scripter-use-the-windows-task-scheduler-to-run-a-windows-powershell-script.aspx

Кто-нибудь запускает этот тип ошибки раньше или знает, как обойти эту проблему?

Устранение неполадок:

Я решил попробовать позвонить в .bat файл по запланированной задаче. Я создал простой файл, который будет отображать текущую дату/время в контролируемой папке. Запуск файла вручную и с помощью задачи, инициированной событием 4740, достигли желаемых результатов. Изменение файла .bat вместо вызова файла .ps1 работало вручную. Когда срабатывает событие 4740, теперь байт больше не будет работать.

qaru.site

python-3.x - Команда workon не работает в Windows PowerShell для активации virtualenv

Существует гораздо более простое решение! Просто зайдите в свою папку сценариев python, где существует файл workon.bat и создайте новый файл с именем workon.ps1 и добавьте в него следующую строку

iex ("~\Envs\" + $args[0] + "\Scripts\activate.ps1")

Вам нужно изменить это соответствующим образом, если вы храните свои виртуальные имена в другом месте, а также установите для политики выполнения сценарии разрешения. Теперь вы можете использовать workon как в cmd, так и в powershell, так как ps1 будет выполняться в powershell и bat в cmd.

Вы также можете проверить мою вилку (полное раскрытие: я автор части powershell) virtualenvwrapper-win, которая содержит некоторые перезаписанные сценарии для powershell и должен работать как с CMD, так и с PowerShell. Если вы хотите скопировать-вставить, создайте два файла, workon.ps и `cdproject.

workon.ps1:

if (-not (Test-Path env:WORKON_HOME)) { $WORKON_HOME = '~\Envs' } else { $WORKON_HOME = ($env:WORKON_HOME).Replace('"','') } if (-not (Test-Path env:VIRTUALENVWRAPPER_PROJECT_FILENAME)) { $VIRTUALENVWRAPPER_PROJECT_FILENAME = '.project' } else { $VIRTUALENVWRAPPER_PROJECT_FILENAME = ($env:VIRTUALENVWRAPPER_PROJECT_FILENAME).Replace('"','') } if ($args.length -eq 0) { echo "Pass a name to activate one of the following virtualenvs:" echo ============================================================================== (Get-ChildItem -Path $WORKON_HOME).Name return } $VENV = $args[0] if (!(Test-Path -Path ("$($WORKON_HOME)\$($VENV)"))) { echo ("virtualenv $($VENV) does not exist") echo "Create it with 'mkvirtualenv $($VENV)'" return } if (!(Test-Path -Path ("$($WORKON_HOME)\$($VENV)\Scripts\activate.ps1") )) { echo "$($WORKON_HOME)$($VENV)" echo "doesn't contain a virtualenv (yet)." echo "Create it with 'mkvirtualenv $($VENV)'" return } iex ("$($WORKON_HOME)\$($VENV)\Scripts\activate.ps1") if (Test-Path -Path ("$($WORKON_HOME)\$($VENV)\$($VIRTUALENVWRAPPER_PROJECT_FILENAME)")) { iex "cdproject" }

cdproject.ps1:

function Show-Usage { echo "" echo "switches to the project dir of the activated virtualenv" } if (-not (Test-Path env:VIRTUAL_ENV)) { echo "" echo "a virtualenv must be activated" Show-Usage return } if (-not (Test-Path env:VIRTUALENVWRAPPER_PROJECT_FILENAME)) { $VIRTUALENVWRAPPER_PROJECT_FILENAME = '.project' } else { $VIRTUALENVWRAPPER_PROJECT_FILENAME = ($env:VIRTUALENVWRAPPER_PROJECT_FILENAME).Replace('"','') } if (-not (Test-Path "$($env:VIRTUAL_ENV)\$($VIRTUALENVWRAPPER_PROJECT_FILENAME)")) { echo "" echo "No project directory found for current virtualenv" Show-Usage return } $ENVPRJDIR = Get-Content "$($env:VIRTUAL_ENV)\$($VIRTUALENVWRAPPER_PROJECT_FILENAME)" -First 1 # If path extracted from file contains env variables, the system will not find the path. # TODO: Add this functionality cd $ENVPRJDIR

qaru.site

Создание ярлыка Powershell не работает

Итак, у меня есть этот скрипт, который автоматизирует установку некоторого программного обеспечения. После установки программного обеспечения я создаю ярлыки для некоторых важных приложений, эти ярлыки появляются на рабочем столе. Вот мой код.

$ConfigureExeSource = "C:\Program Files (x86)\SiteKiosk\Configure.exe" $ConfigureLoc = "C:\Users\Public\Desktop\Configure.lnk" $StartSiteKioskExeSource = "C:\Program Files (x86)\SiteKiosk\SiteKiosk.exe" $StartSiteKioskLoc = "C:\Users\Public\Desktop\SiteKiosk.lnk" $CheckKioskExeSource = "C:\Users\Public\Documents\checkkiosk.exe" $CheckKioskLoc = "C:\Users\Public\Desktop\checkkiosk.lnk" #copying to desktop $WshShell = New-Object -ComObject WScript.Shell $Shortcut = $WshShell.CreateShortcut($ConfigureLoc) $Shortcut.TargetPath = $ConfigureExeSource $Shortcut.Save() Write-Host "Created Configure.exe Shortcut" $WshShell = New-Object -ComObject WScript.Shell $Shortcut = $WshShell.CreateShortcut($StartSiteKioskLoc) $Shortcut.TargetPath = $StartSiteKioskExeSource $Shortcut.Save() Write-Host "Created Sitekiosk.exe Shortcut" $WshShell = New-Object -ComObject WScript.Shell $Shortcut = $WshShell.CreateShortcut($CheckKioskLoc) $Shortcut.TargetPath = $CheckKioskExeSource $Shortcut.Save() Write-Host "Created Checkkiosk.exe Shortcut"

Затем я получаю ярлыки, после чего я тестировал каждый. Это привело к тому, что все они работали, кроме ярлыка «Настроить».

Я вручную создал ярлык конфигурации, чтобы убедиться, что у меня есть правильный путь, и я это сделал. Затем я сравнил другие свойства, и я обнаружил, что свойство startIn пустое для моей PowerShell, но заполнено «C: \ Program Files (x86) \ SiteKiosk» в созданном вручную. Я скопировал это на powershell один, и это сработало.

Теперь у меня нет идеи, что происходит, потому что ярлык sitekiosk работал без поля, заполненного, но по какой-то причине он его не хочет, иначе он не будет работать. кто-нибудь знает, как я могу исправить свой код, чтобы правильно генерировать ярлык, который работает, даже если исправление просто генерирует это поле для ярлыка. Я огляделся и не нашел способ заполнить поле startIn в ярлыке.

PS: Я пытался загружать фотографии, но stackoverflow не позволял мне, поскольку у меня есть ниже 10 rep, я могу загрузить их в imgur, хотя если кто-нибудь подумает, что это поможет.

stackoverrun.com

windows - PowerShell - If/Else Statement не работает должным образом

Другой ответ объяснил, почему ваш код не работает. Я не пойду туда. Вместо этого я дам несколько предложений, которые, я думаю, улучшат ваш сценарий и объяснят, почему я так думаю. Начнем с функций. Некоторые из вещей, которые вы делаете, - это функции, которые я держу под рукой, потому что они хорошо работают и используются достаточно часто, чтобы мне было удобно.

Во-первых, ваш диалог, чтобы получить путь к файлу CSV. Это работает, не поймите меня неправильно, но, возможно, это будет лучше... Как вы открываете диалог Open File без параметров. Эта функция позволяет вам использовать несколько разных параметров по желанию или нет для очень общего диалогового окна Open File, но я думаю, что здесь небольшое улучшение:

Function Get-FilePath{ [CmdletBinding()] Param( [String]$Filter = "|*.*", [String]$InitialDirectory = "C:\") [void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog $OpenFileDialog.initialDirectory = $InitialDirectory $OpenFileDialog.filter = $Filter [void]$OpenFileDialog.ShowDialog() $OpenFileDialog.filename }

Тогда просто назовите это как таковое:

$CSVFile = Get-FilePath -Filter "Comma Separated Value (.CSV)|*.CSV" -InitialDirectory "$env:USERPROFILE\Desktop"

Это открывает фильтрацию диалогов только для файлов CSV и запускает их, глядя на их рабочий стол (я нахожу, что многие люди спасают вещи на своем рабочем столе). Это только путь, поэтому вы будете выполнять свою проверку, как и вы. Собственно, не так, как ты. Кажется, у вас действительно сложнее всего. Бит, я доберусь до этого, во-первых, еще одну функцию! Вы часто вызываете ящики сообщений и набираете кучу опций, вызываете тип и все раз в один раз. Если вы собираетесь делать это более одного раза, облегчите себе, сделайте функцию. Здесь, проверьте это:

Function Show-MsgBox ($Text,$Title="",[Windows.Forms.MessageBoxButtons]$Button = "OK",[Windows.Forms.MessageBoxIcon]$Icon="Information"){ [Windows.Forms.MessageBox]::Show("$Text", "$Title", [Windows.Forms.MessageBoxButtons]::$Button, $Icon) | ?{(!($_ -eq "OK"))} }

Затем вы можете указать столько или меньше, сколько хотите. Кроме того, он использует параметры Type'd, поэтому завершение табуляции или в ISE (если вы там пишете свой скрипт, как и я), он выдает действительные параметры, и вы просто выбираете из списка кнопки или значок показывать. Плюс он ничего не возвращает, если это простой ответ "ОК", чтобы сохранить чистоту, но вернет Да/Нет/Отменить или любой другой вариант, который вы выбираете для кнопок.

Хорошо, что функции, пусть попадает в мясо скрипта. Проверка вашего файла... Хорошо, вы вытаскиваете первую строку файла, так что это должна быть строка, я не уверен, почему вы ее разделяете и проверяете каждый заголовок отдельно. Просто совместите строку в целом. Я бы предложил сделать это без учета регистра, так как здесь нас не волнует. Кроме того, в зависимости от того, как был создан CSV файл, в заголовках могут быть кавычки, которые вы можете захотеть получить. Использование -Match будет выполнять матч -Match который немного более прощает.

If((Get-Content $CSVFile -TotalCount 1) -match '^"?machine name"?,"?mac"?$'){ Show-MsgBox "The CSV File headers must be Machine Name and MAC." 'Invalid CSV File headers!' -Icon Warning break }

Итак, теперь у нас есть две функции и 5 строк кода. Да, функции занимают больше места, чем у вас ранее, но они более дружелюбны для работы, а IMO более функциональны. Ваша коррекция MAC-адреса и часть отправки WOL - это все тузы, насколько мне известно. Нет причин менять эту часть. Теперь, для проверки того, что компьютеры вернулись... здесь мы могли бы использовать некоторое улучшение. Вместо того, чтобы сделать [List] просто добавьте элемент к каждому объекту, затем отфильтруйте его ниже. Сценарий в целом будет немного длиннее, но лучше для него, я думаю.

Add-Type -AssemblyName Microsoft.VisualBasic,System.Windows.Forms Function Get-FilePath{ [CmdletBinding()] Param( [String]$Filter = "|*.*", [String]$InitialDirectory = "C:\") [void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog $OpenFileDialog.initialDirectory = $InitialDirectory $OpenFileDialog.filter = $Filter [void]$OpenFileDialog.ShowDialog() $OpenFileDialog.filename } Function Show-MsgBox ($Text,$Title="",[Windows.Forms.MessageBoxButtons]$Button = "OK",[Windows.Forms.MessageBoxIcon]$Icon="Information"){ [Windows.Forms.MessageBox]::Show("$Text", "$Title", [Windows.Forms.MessageBoxButtons]::$Button, $Icon) | ?{(!($_ -eq "OK"))} } #Get File Path $CSVFile = Get-FilePath -Filter "Comma Separated Value (.CSV)|*.CSV" -InitialDirectory "$env:USERPROFILE\Desktop" #Validate Header If((Get-Content $CSVFile -TotalCount 1) -match '^"?machine name"?,"?mac"?$'){ Show-MsgBox "The CSV File headers must be Machine Name and MAC." 'Invalid CSV File headers!' -Icon Warning break } $ComputerList = Import-Csv -Path $CSVFile | Out-GridView -PassThru -Title "Select Computers to Wake up" ForEach($Computer in $ComputerList) { If($Computer.'MAC' -notmatch '([:]|[-])') { $Computer.'MAC' = $Computer.'MAC' -replace '(..(?!$))','$1:' } $MACAddr = $Computer.'MAC'.split('([:]|[-])') | %{ [byte]('0x' + $_) } $UDPclient = new-Object System.Net.Sockets.UdpClient $UDPclient.Connect(([System.Net.IPAddress]::Broadcast),4000) $packet = [byte[]](,0xFF * 6) $packet += $MACAddr * 16 [void] $UDPclient.Send($packet, $packet.Length) write "Wake-On-Lan magic packet sent to $($Computer.'Machine Name'.ToUpper())" } Write-Host "Pausing for sixty seconds before verifying connectivity." Start-Sleep -Seconds 60 $ComputerList|ForEach { Write-Host "Pinging $($_.'Machine Name')" Add-Member -InputObject $_ -NotePropertyName "PingResult" -NotePropertyValue (Test-Connection -ComputerName $Computer.'Machine Name' -Quiet) } If(($ComputerList|Where{!($_.PingResult)}).Count -gt 0) { Show-MsgBox "All machines selected are online." 'Success' } Else { Show-MsgBox "The following machines did not respond to a ping: $(($ComputerList|?{!($_.PingResult)}) -join ", ")" 'Unreachable Machines' -Icon Asterisk }

Хорошо, я собираюсь выйти из коробки с мылом и вернуться домой, сменить ее, и настало время для холодного.

qaru.site

powershell - PowerShell: Копировать элемент не работает, несмотря на тот же процесс, который работает с проводником Windows

У меня есть script, который должен копировать файлы на регулярной основе (каждый час). Я могу открыть исходную и целевую папку с помощью Windows Explorer и скопировать файл без проблем.

Однако, если я попробую то же самое в PowerShell, я получаю доступ к пути, которому отказано в ошибке. Я проверил разрешения на общий ресурс, и у меня есть полный доступ. Почему это происходит с помощью PowerShell?

Команда Copy-Item:

Copy-Item \\idmststtrm2\tns_admin$\tnsnames.ora -Destination \\bts13r2b\tnsnames -Force

Ошибки:

Copy-Item : Access to the path '\\bts13r2b\tnsnames\tnsnames.ora' is denied. At line:1 char:1 + Copy-Item \\idmststtrm2\tns_admin$\tnsnames.ora -Destination \\bts13r2b\tnsnames ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (\\idmststtrm2\tns_admin$\tnsnames.ora:FileInfo) [Copy-Item], UnauthorizedAccessException + FullyQualifiedErrorId : CopyFileInfoItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.CopyItemCommand Copy-Item : Access to the path '\\bts13r2b\tnsnames\tnsnames.ora' is denied. At line:1 char:1 + Copy-Item \\idmststtrm2\tns_admin$\tnsnames.ora -Destination \\bts13r2b\tnsnames ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Copy-Item], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.CopyItemCommand

Изменения:

Когда я выполняю Get-ChildItem по пути назначения, я могу видеть содержимое папки.

Результаты получения элемента:

get-item \\idmststtrm2\tns_admin$\tnsnames.ora Directory: \\idmststtrm2\tns_admin$ Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 3/10/2017 8:49 AM 14143 tnsnames.ora get-item \\bts13r2b\tnsnames\tnsnames.ora Directory: \\bts13r2b\tnsnames Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 3/8/2017 9:51 AM 15991 tnsnames.ora get-item \\bts13r2b\tnsnames Directory: Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 3/21/2017 11:14 AM tnsnames

Пробовал использовать xcopy:

xcopy \\idmststtrm2\tns_admin$\tnsnames.ora \\bts13r2b\tnsnames\tnsnames.ora Access is denied. источник поделиться

qaru.site

powershell - Скрипт Powershell не работает должным образом в качестве запланированной задачи в Windows 2008

У меня есть этот скрипт, который соединяется с кучей серверов и получает статус службы, ошибки из журналов приложений и систем и дискового пространства. Он отлично работает в качестве запланированной задачи в Windows XP, но имеет некоторые странные проблемы в Windows 2008. Я использую функцию для импорта учетных данных из отдельного файла, где они хранятся в зашифрованном виде:

function Import-credential($path) { $cred = Import-Clixml $path $cred.password = $cred.Password | ConvertTo-SecureString New-Object system.Management.Automation.PSCredential( $cred.username, $cred.password) }

Это отлично работает, когда я запускаю его вручную и когда он запускается в качестве запланированной задачи в Windows XP, но не работает в Windows 2008 со следующей ошибкой:

New-Object : Exception calling ".ctor" with "2" argument(s): "Cannot process ar gument because the value of argument "password" is null. Change the value of ar gument "password" to a non-null value." At F:\Tools\MCHS Server Report\monitor.ps1:9 char:15 + New-Object <<<< system.Management.Automation.PSCredential( + CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvoca tionException + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.Power Shell.Commands.NewObjectCommand

Это строка 9:

New-Object system.Management.Automation.PSCredential(

В планировщике задач у меня есть полный путь к powershell.exe в Program/Script и -command и "F:\Tools\MCHS Server Report\monitor.ps1" в разделе "Добавить аргументы".

Есть идеи?

EDIT: Я попытался изменить учетную запись, в которой он работает, на мой собственный (я использовал локальную учетную запись, специально созданную для запланированных задач), и она работала хорошо. У меня есть 0 идей относительно того, почему он не будет работать с другим пользователем, учитывая, что мы оба Администраторы и, похоже, имеем те же привилегированные...

задан linnah 17 мая '13 в 12:46 источник поделиться

qaru.site

powershell - Сценарий powershell не работает на сервере Windows Jenkins

Мы установили Jenkins (1.643) в машину Windows. Я создал сценарий powershell, который соединится с моим Linux-сервером.

Import-Module SSH-Sessions New-SshSession -ComputerName vagrantvm -Username test -Password test@123 Invoke-SshCommand -ComputerName vagrantvm -Command "cd /NFS_DATA/SP5/latest && echo test@123 | sudo -S ./test.sh /NFS_DATA/SP5/latest $App_Server"

Этот код отлично работает в терминале PowerShell IDE и PowerShell. Но он не работает в работе Jenkins → Execute Windows Powershell

Сообщение об ошибке:

Импорт-модуль: указанный модуль "SSH -S essions" не был загружен, поскольку в любом каталоге модулей не было найдено допустимого файла модуля. В C:\Program Files (x86)\Jenkins\jobs\VeoCanDev_6.1Deploy\workspace\autodeploy.ps1: 9 char: 22 + Import-Module <<<< SSH -S essions + CategoryInfo: ResourceUnavailable: (SSH -S ] essions: String) [Impo rt-Module], FileNotFoundException

Новый -S shSession <<<< -ComputerName $ dev_app1 -Username arthi_balakris hnan -Password Hybris @123 + CategoryInfo: ObjectNotFound: (Новый -S shSession: String) [], Comm andNotFoundException

Invoke -S shCommand <<<< -ComputerName $ dev_app1 -Command "cd/NFS_DA TA/SP5/последний && echo Hybris @123 | sudo -S./test.sh/NFS_DATA/SP5/последний $ App_ Server "+ CategoryInfo: ObjectNotFound: (Invoke -S shCommand: String) [], C ommandNotFoundException

Когда я Get-Module -ListAvailable в терминале PowerShell на сервере Jenkins, выводимый вывод:

ModuleType Name ExportedCommands ---------- ---- ---------------- Manifest AppLocker {} Manifest BitsTransfer {} Manifest PSDiagnostics {} Manifest SSH {} Manifest SSH-Sessions {} Manifest TroubleshootingPack {} Manifest WebAdministration {} Manifest AutoItX {}

Но когда одна и та же команда выполняется в задании Jenkins, модули SSH не перечислены:

ModuleType Name ExportedCommands ---------- ---- ---------------- Manifest BitsTransfer {} Manifest PSDiagnostics {} Manifest TroubleshootingPack {} Manifest WebAdministration {} Manifest AutoItX {} источник поделиться

qaru.site