#powershell #task #access-denied #taskscheduler #unc
#powershell #задача #доступ запрещен #taskscheduler #unc
Вопрос:
PowerShell 3
Windows 2012
Основная незначительная ревизия сборки
3 0 -1 -1
У меня есть несколько сценариев PowerShell, которые работали в течение последних нескольких лет.
Теперь они, похоже, не могут успешно выполняться с помощью запланированной задачи.
Если я вручную запускаю сценарий PowerShell вне планировщика задач, он работает.
Сценарий просто создает новую папку по пути UNC.
При попытке «Test-Path» выдается ошибка «Отказано в доступе».
Похоже, что это может вызвать проблемы с разрешениями, однако он работает, используя тот же логин и просто дважды щелкнув скрипт.
Запланированная задача настроена на использование тех же учетных данных, с которыми я выполняю вход на сервер при ручном запуске скрипта.
Я создал новую базовую задачу в планировщике, и она по-прежнему не работает.
Я сократил код до базового тестового пути и создал папку, и все еще не работает.
Я создаю командный файл для чтения и создаю папку в каталоге, настраиваю его на запуск через запланированную задачу, и это работает.
Вывод ошибки:
C:Scripts>c:
C:Scripts>cdscripts
C:Scripts>powershell.exe c:scriptsmakefolder.ps1
Creating New Folders...
Test-Path Result with SilentlyContinue... Does the folder exist already?
False
The folder is: \intranet.mycompany.comdeptfinanceShared DocumentsSales CommissionsMyTest
test-path : Access is denied
At C:scriptsmakefolder.ps1:23 char:6
IF (test-path -path $today_folder)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : PermissionDenied:
(\intranet.myco...missionsMy
Test:String) [Test-Path], UnauthorizedAccessException
FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.Powe
rShell.Commands.TestPathCommand
New-Item : Access is denied
At C:scriptsmakefolder.ps1:28 char:11
{New-Item -ItemType Directory -Path $today_folder
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : PermissionDenied: (\intranet.myco...missionsMy
Test:String) [New-Item], UnauthorizedAccessException
FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.Powe
rShell.Commands.NewItemCommand
Командный файл, который выполняет запланированная задача. Это просто запускает сценарий PowerShell. Я также удалил этот командный файл, и запланированная задача запустила PowerShell напрямую с теми же результатами:
c:
cdscripts
powershell.exe c:scriptsmakefolder.ps1
Вот сценарий PowerShell:
Write-Host 'Creating New Folders...
' -fore black -back yellow
$today_folder = "\intranet.mycompany.comdeptfinanceShared DocumentsSales CommissionsMyTest"
Write-Host 'Test-Path Result with SilentlyContinue... Does the folder exist already?
' -fore black -back yellow
test-path -path $today_folder -ErrorAction SilentlyContinue
write-host 'The folder is: ' $today_folder
write-host '
'
IF (test-path -path $today_folder)
#Folder Already Exist
{ Write-Host $today_folder ":Already Exist, moving on..." -fore black -back green }
ELSE
#Create the Folder
{New-Item -ItemType Directory -Path $today_folder
Write-Host $today_folder ":Created" -fore black -back yellow}
#To see the console window
sleep 5
#Read-Host -Prompt "Press Enter to exit"
Если я выполняю аналогичную функцию, просто используя пакетный файл, это работает:
@echo off
echo Hello this a test batch file
pause
net use L: "\intranet.mycompany.comdeptfinanceShared DocumentsSales Commissions"
dir L:
pause
mkdir L:M2019
pause
net use L: /delete
echo all done
pause
Комментарии:
1. Вы успешно запустили скрипт как пользователь, настроенный для запуска задания в планировщике задач?
2. ДА. Я вошел в систему как этот пользователь. Если я выполняю пакет или файл Powershell, он работает нормально. Этот логин также является автором запланированной задачи.
3. Если вы замените
Test-Path
логику на[System.IO.Directory]::Exists($today_folder)
, вы получите лучший результат?4. Спасибо, Хм, нет ошибки с предложенным вами «[System.IO.Directory]::Exists($today_folder)», но теперь ошибка перешла к попытке создать папку :: New-Item: доступ запрещен в C:scriptsmakefolder.ps1:28 символ:11 {Новый каталог-Item -ItemType -Path$today_folder
5. Тогда, я думаю, вы можете заменить
New-Item
логику на[System.IO.Directory]::CreateDirectory($today_folder)
.
Ответ №1:
Я заставил его работать, добавив ИСПОЛЬЗОВАНИЕ СЕТИ и указав учетные данные внутри сценария PowerShell.
Спасибо @AdminOfThings, по крайней мере, за то, что заставил меня думать по-другому.
Я понятия не имею, почему это только начало происходить. Я также не понимаю, почему только у планировщика задач возникла проблема с разрешениями. Я использовал те же учетные данные для входа, с которыми я вошел в систему, те же, которые создавали задачи, и те же, которые хранятся в каждой задаче.
$user = 'corpcrazyuser'
$passwd = 'myPassword'
$today_folder = "\intranet.mycompany.comdeptfinanceShared DocumentsSales Commissions"
$subfolder = "TestFolder"
$complete_folder = $today_folder '' $subfolder
#open path
NET USE $today_folder /user:$user $passwd
IF (test-path -path $complete_folder)
#Folder Already Exist
{ Write-Host $complete_folder ":Already Exist, moving on..." -fore black -back green }
ELSE
#Create the Folder
{New-Item -ItemType Directory -Path $complete_folder
Write-Host $complete_folder ":Created" -fore black -back yellow}
write-host '
Closing NET UNC path
'
NET USE /DELETE $today_folder
Комментарии:
1. Существует способ взлома, если вы не хотите иметь пароль в скрипте: откройте свою папку с достаточными привилегиями (например, пользователь домена), откройте powershell от имени администратора и создайте символическую ссылку из UNC на локальный путь New-Item -ItemType SymbolicLink -Path «C:LocalTemp » -Значение «unc» Теперь вы можете напрямую использовать UNC-путь в вашем сценарии powershell, он откроет его с помощью учетных данных, предоставленных в запланированной задаче. Вероятно, есть некоторые проблемы с учетными данными в запланированных задачах, однако, на мой взгляд, это все же лучше, чем пароль в понятном или псевдо запутанном в сценариях.