PowerShell Test-доступ по UNC пути запрещен только через запланированную задачу

#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, он откроет его с помощью учетных данных, предоставленных в запланированной задаче. Вероятно, есть некоторые проблемы с учетными данными в запланированных задачах, однако, на мой взгляд, это все же лучше, чем пароль в понятном или псевдо запутанном в сценариях.