web-dev-qa-db-fra.com

Exécutez un script PowerShell sur un autre serveur - de l'intérieur d'un emploi SQL Server

J'ai une procédure pour sauvegarder les bases de données SSAS .

Cela fonctionne comme un charme.

Maintenant, mon serveur remplit avec des sauvegardes SSAS et je souhaite supprimer les fichiers de sauvegarde de plus de 2 jours.

pour y parvenir, j'utilise le script PowerShell suivant:

#-------------------------------------------------------------------------------
# Script to delete old SSAS backup files
#
# Marcelo Miorelli
# 
# 19-novembre-2014 Wed
#-------------------------------------------------------------------------------


#-- connect to the remote server -- SQLBILON1
#
ENTER-PSSESSION sqlbilon1


#-- set the Path where the backup files (.abf) are located
#
$path = 'H:\SQLBackups'

#-- set the number of days backups should be deleted -- in this case 2
#
$NumberOfDays = 2

#-- calculate the date of the backup files - if they are older than $days they will be deleted
#
$days = (Get-Date).AddDays(-$NumberOfDays)

#--get the list of the backup files to be deleted and delete them
#
Get-ChildItem $Path -Recurse '*.abf' | ? {$_.CreationTime -lt $days} | Remove-Item

Le problème avec ce script est que j'utilise MySQLServer1 Server pour sauvegarder les bases de données sur SQLBILON1 Server. Les fichiers de sauvegarde sont sur le dossier H:\sqlbackups de SQLBILON1.

Le travail échoue avec le message d'erreur suivant:

 The job script encountered the following errors. These errors did not stop the script:
A job step received an error at line 13 in a PowerShell script. 
The corresponding line is 'ENTER-PSSESSION sqlbilon1'. 
Correct the script and reschedule the job. The error information returned by PowerShell is: 
'Connecting to remote server failed with the following error message : 
Access is denied. For more information, see the about_Remote_Troubleshooting Help topic.'

Question, comment puis-je exécuter un script PowerShell sur un serveur distant? Ce script fonctionne à partir d'un travail SQL Server.

Puis-je créer un proxy et l'utiliser pour se connecter au serveur distant?

5
Marcello Miorelli

Si vous êtes dans un environnement de domaine, vous pouvez configurer un compte proxy contenant des autorisations sur SQLBILON1. Cependant, l'utilisation de PowerShell distant est un peu surkill et ajoute une couche inutile pour résoudre le problème. Si vous n'avez pas de PowerShell distant activé sur les deux serveurs et l'accès au pare-feu entre les serveurs configurés correctement, il aura des problèmes.

Je voudrais simplement utiliser des chemins UNC sur le serveur. Si vous utilisez l'administrateur partage comme \\SQLBILON1\H$\SQLBackups ou créer des actions directement à \\SQLBILON1\SQLBackups. Sauf si vous voulez donner au service d'agent SQL sur MYSQLSERVER1 Autorisations à ce répertoire de sauvegarde dont vous aurez besoin pour créer un compte proxy ayant les autorisations appropriées.

Votre script sera beaucoup plus simplement si vous allez simplement aller cet itinéraire:

#-------------------------------------------------------------------------------
# Script to delete old SSAS backup files
#
# Marcelo Miorelli
# 
# 19-novembre-2014 Wed
#-------------------------------------------------------------------------------


#-- set the Path where the backup files (.abf) are located
#
$path = '\\SQLBILON1\H$\SQLBackups' # OR \\SQLBILON1\SQLBackups

#-- set the number of days backups should be deleted -- in this case 2
#
$NumberOfDays = 2

#-- calculate the date of the backup files - if they are older than $days they will be deleted
#
$days = (Get-Date).AddDays(-$NumberOfDays)

#--get the list of the backup files to be deleted and delete them
#
Get-ChildItem $Path -Recurse '*.abf' | ? {$_.CreationTime -lt $days} | Remove-Item
3
user507

Basé sur la réponse de @shawn Melton ci-dessus

J'ai créé un proxy dans SQL Server en utilisant ce code:

-- script for creating a proxy in order to run a set of POWERSHELL commands
-- this is to delete backups older than 2 days
-- marcelo miorelli
-- 19-nov-2014

--==============================================================================================
-- server is MySQLServer1
-- and this script deletes old backup files that are located on SQLBILON1 

  PRINT @@SERVERNAME
--==============================================================================================




--Script #1 - Creating a credential to be used by proxy
USE MASTER
GO 
--Drop the credential if it is already existing 
IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = N'PowerShell_Credentials') 
BEGIN 
DROP CREDENTIAL [PowerShell_Credentials] 
END 
GO 
CREATE CREDENTIAL [PowerShell_Credentials] 
WITH IDENTITY = N'MYCOMPANY\SQLAgent_DW', 
SECRET = N'zd(8A1(7m5=xSC%mTsDw<4V)6@vQfp+f' 
GO


--Script #2 - Creating a proxy account 
USE msdb
GO 
--Drop the proxy if it is already existing 
IF EXISTS (SELECT 1 FROM msdb.dbo.sysproxies WHERE name = N'PowerShell_Proxy') 
BEGIN 
EXEC dbo.sp_delete_proxy 
@proxy_name = N'PowerShell_Proxy' 
END 
GO 
--Create a proxy and use the same credential as created above 
EXEC msdb.dbo.sp_add_proxy 
@proxy_name = N'PowerShell_Proxy', 
@credential_name=N'PowerShell_Credentials', 
@enabled=1 
GO 
--To enable or disable you can use this command 
EXEC msdb.dbo.sp_update_proxy 
@proxy_name = N'PowerShell_Proxy', 
@enabled = 1 --@enabled = 0 
GO

--Script #3 - Granting proxy account to SQL Server Agent Sub-systems 
USE msdb
GO 
--You can view all the sub systems of SQL Server Agent with this command
--You can notice for SSIS Subsystem id is 11 
EXEC sp_enum_sqlagent_subsystems 
GO

--Grant created proxy to SQL Agent subsystem 
--You can grant created proxy to as many as available subsystems 
EXEC msdb.dbo.sp_grant_proxy_to_subsystem 
@proxy_name=N'PowerShell_Proxy', 
@subsystem_id=11 --subsystem 11 is for SSIS as you can see in the above image 
GO 
EXEC msdb.dbo.sp_grant_proxy_to_subsystem 
@proxy_name=N'PowerShell_Proxy', 
@subsystem_id=12 --subsystem 12 is for PowerShellStart
GO 
EXEC msdb.dbo.sp_grant_proxy_to_subsystem 
@proxy_name=N'PowerShell_Proxy', 
@subsystem_id=10 --subsystem 10 is for ANALYSISCOMMAND
go

--View all the proxies granted to all the subsystems 
EXEC dbo.sp_enum_proxy_for_subsystem


--Script #4 - Granting proxy access to security principals 
USE msdb
GO 
--Grant proxy account access to security principals that could be
--either login name or fixed server role or msdb role
--Please note, Members of sysadmin server role are allowed to use any proxy 
EXEC msdb.dbo.sp_grant_login_to_proxy 
@proxy_name=N'PowerShell_Proxy'
,@login_name=N'MYCOMPANY\SQLAgent_DW' 
--,@fixed_server_role=N'' 
--,@msdb_role=N'' 
GO 
--View logins provided access to proxies 
EXEC dbo.sp_enum_login_for_proxy 
GO

et après cela, j'ai changé mon script PowerShell sur ce qui suit: (qui est un peu différent de @ Shawnmelton, mais cela fonctionne bien), les commentaires appréciés.

set-location -Path Microsoft.PowerShell.Core\FileSystem::"\\SQLBILON1\H$\sqlBackups\"

#-- set the number of days backups should be deleted -- in this case 2
#
$NumberOfDays = 2

#-- calculate the date of the backup files - if they are older than $days they will be deleted
#
$days = (Get-Date).AddDays(-$NumberOfDays)

#--get the list of the backup files to be deleted and delete them
#
Get-ChildItem -Recurse '*.abf' | ? {$_.CreationTime -lt $days} | Remove-Item
1
Marcello Miorelli