PowerShell Refresh Excel без открытия файла Excel (проблема запланированного выполнения пакета с агентом SQL)

У меня есть пакет служб SSIS, который я разработал с "Задачей выполнения процесса" и "Задачей потока данных". У меня проблема с оформлением пакета.

РЕЗУЛЬТАТЫ: (Ручной или запланированный)

Все процессы успешны, если запуск выполняется вручную в 32-разрядном режиме из VS и SSISDB, когда я вхожу в систему с определенным профилем пользователя 'GEORGES/BL0040EP'.

  1. "Выполнить задачу процесса" - запустить сценарий powershell, чтобы обновить соединения Excel и сохранить файл Excel. (УСПЕХ)
  2. "Задача потока данных" - считывает данные Excel и вставляет их в таблицу SQL Server. (УСПЕХ)

Я пытаюсь запустить пакет с агентом SQL (используя учетную запись прокси), и у процесса есть некоторые проблемы.

  1. "Выполнить задачу процесса" - запустить сценарий powershell для обновления соединений Excel (НЕ РАБОТАЕТ, НЕ СООБЩЕНИЯ ОБ ОШИБКАХ). Сохраните файл Excel (УСПЕХ).
  2. "Задача потока данных" - считывает данные Excel и вставляет их в таблицу SQL Server. (УСПЕХ)

ПРОБЛЕМА:

powershell script to refresh the Excel file казалось бы, не выдается на сервер SSAS при запуске из SQL Agent , Не "запрос успешно выполнен". Не "запрос проблем с правами доступа". Просто "запрос вообще не выполняется". Проблемы с разрешениями не регистрируются и не обнаруживаются.

Я могу сказать, потому что я запустил SQL Profiler на сервере. Когда агент вызывает пакет, запрос не выполняется. Когда VS/SSISDIB вызывает пакет, я вижу, как выполняется запрос. Оба успешно с профилем пользователя (GEORGES\bl0040ep); и неудачно с ошибкой прав доступа с неавторизованным профилем пользователя (GEORGES\bl0040).

ВОПРОС:

Почему агент SQL не запускает запрос?

Я даже добавил к шикарной команде $env:UserName | Out-File -filepath вывести текстовый файл, содержащий имя пользователя. И настройка учетной записи прокси-сервера, кажется, работает в ожидаемом контексте профиля пользователя. Содержание текстового файла bl0040ep,


Создать учетную запись прокси

Создание прокси-пользователя для запуска пакета служб SSIS в агенте SQL Server

USE master 
GO

-- Create a proxy credential for xp_cmdshell.
EXEC sp_xp_cmdshell_proxy_account 'GEORGES\bl0040ep', '!myPW!';--SELECT  * FROM [master].[sys].[credentials]

-- Grant execute permission on xp_cmdshell to the SQL Server login account. 
GRANT exec ON sys.xp_cmdshell TO [GEORGES\bl0040ep] 
GO

-- Create a credential containing the GEORGES account PowerGEORGES\PowerUser and its password
CREATE CREDENTIAL Credential_BL0040EP WITH IDENTITY = N'GEORGES\bl0040ep', SECRET = N'!myPW!'
GO

USE [msdb]
GO
-- Create a new proxy called SSISProxy and assign the PowerUser credentail to it
EXEC msdb.dbo.sp_add_proxy @proxy_name=N'Proxy_BL0040EP',@credential_name=N'Credential_BL0040EP',@enabled=1

-- Grant SSISProxy access to the "SSIS package execution" subsystem
EXEC msdb.dbo.sp_grant_proxy_to_subsystem @proxy_name=N'Proxy_BL0040EP', @subsystem_id=11

-- Grant the login testUser the permissions to use SSISProxy
EXEC msdb.dbo.sp_grant_login_to_proxy @login_name = N'GEORGES\bl0040ep', @proxy_name=N'Proxy_BL0040EP'
GO

DatabaseSSAS_UsageStats_xlsx_ExcelRefresh.ps1

# Refresh the excel workbook connections and save the updated file
$file = 'C:\SVN\BusinessAnalysts\ExcelTools\DatabaseSSAS_UsageStats.xlsx'
$x1 = New-Object -ComObject Excel.Application
$x1.Visible = $false
$x1.DisplayAlerts = $False
$enddate = (Get-Date).tostring("dd-MM-yy")
# $filename = 'C:\SVN\BusinessAnalysts\ExcelTools\DatabaseSSAS_Usage Stats ' + $enddate + '.xlsx'
$filename = 'C:\SVN\BusinessAnalysts\ExcelTools\DatabaseSSAS_UsageStats.xlsx' 
$env:UserName | Out-File -filepath C:\SVN\BusinessAnalysts\ExcelTools\RefreshAll_process.txt
$wb = $x1.workbooks.Open($file)
$wb.refreshall() 

# REM: Use SLEEP to eliminate the message: "This will cancel a pending data refresh. Continue?"
Start-Sleep -Second 20
$wb.SaveAs($filename)
$wb.Close()
$x1.Quit()
Remove-Variable wb,x1

SQL Profiler

При запуске пакета из агента SQL не выполняется никаких действий. При запуске из VS и SSISDB регистрируется ошибка входа.

SQLProfiler_ (VS / SSIDB-connectionerror_user-bl0040).png

SQLProfiler_(SQL Agent-connection_no-активность).png

Нет изображения для атташе. Просто нет активности для пользователя (bl0040ep), когда пакет запускается в контексте агента SQL.


Ср 06/06/2019 14:31:46.96

ОБНОВЛЕНИЕ 1: папка системного рабочего стола

Я добавил папку "Рабочий стол" в System32, запустил задание из агента SQL, и проблема не исчезла. Это было рекомендовано для аналогичной проблемы, о которой сообщалось о проблемах TechNet с простым скриптом, выполняемым через агент SQL Server C:\Windows\System32\config\systemprofile\Desktop а также C:\Windows\SysWOW64\config\systemprofile\Desktop, Папка уже существует на SysWOW64.

ОБНОВЛЕНИЕ 2: исполняемый файл PowerShell в 32-разрядной версии

Я также попытался напрямую вызвать 32-разрядную версию PowerShell: %SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe, Тем не менее обновление Excel не завершается при запуске через агент SQL с учетной записью прокси. Ссылка Запустите 32-битный скрипт Powershell на агенте сервера Sql.

ОБНОВЛЕНИЕ 3: Планировщик задач Windows вместо задания агента SQL

Я попробовал другой метод планирования для выполнения пакета (Windows Task Scheduler, вместо SQL Agent). Расписание завершается, но ведет себя точно так же, как и агент SQL... запрос не отправляется источнику данных. Справочник "Дневник Нирава", "Планирование пакета служб SSIS без развертывания", задача 2-Windows "Расписание"

1 ответ

Я решил эту проблему, удалив Excel с картинки. Вместо источника Excel теперь я использую соединитель .Net Providers for OleDb\Microsoft OLE DB Provider for Analysis Services 2.0, Есть несколько дополнительных шагов, необходимых в базе данных, чтобы получить тот же набор данных (используя SQL Views вместо Excel Powerquery M).

Я проиграл этот бой в Excel... он не хотел быть автоматизированным. Я все-таки использовал те же ПОЛНОМОЧИЯ и ПРОКСИ для планирования работы.

Другие вопросы по тегам