Domanda

Devo spostare i file da una posizione all'altra in un pacchetto SSIS. Poiché la cartella si trova su un altro dominio, è necessario impersonare un altro account prima di eseguire il comando robocopy.exe. Ho scoperto di poter eseguire un "utilizzo netto" comando per impersonare l'account utente necessario e quindi eseguire il comando robocopy immediatamente dopo. Non vedo alcun modo per farlo in un comando Esegui processo per farlo direttamente, quindi uso un'attività Esegui processo per eseguire un file batch che ha questi due comandi come linee separate. L'aspetto negativo di questo approccio è che non riesco a leggere i risultati del comando Esegui processo. Quindi questo mi porta a tre domande:

  1. Esiste un modo per eseguire un comando multilinea in una singola attività Esegui processo?
  2. Esiste un modo per eseguire robocopy.exe mentre si impersona un altro account in una riga?
  3. Esiste un modo per riscrivere i risultati di un file batch in una variabile in SSIS o nel registro del database SSIS?

Se esiste una risposta positiva per una qualsiasi delle tre domande precedenti, allora potrei essere in grado di trovare un modo per aggiungere regole di successo o fallimento del lavoro basate sui risultati del comando robocopy.

È stato utile?

Soluzione

Questo può essere facilmente raggiunto se hai abilitato l'uso della Procedura memorizzata estesa "xp_cmdshell" (consulta la documentazione online per " Configurazione della superficie ").

Nel seguente esempio ho creato un file .CMD contenente tutte le mie opzioni di ROBOCOPY e semplice esegue questo file di comando usando xp_cmdshell afferrando l'output in una variabile di tabella (può essere invece una tabella persistente):

Basta aggiungere un'attività Esegui istruzione T-SQL al pacchetto SSIS con la seguente istruzione:

/** START **/

DECLARE @cmdfile nvarchar(255) = N'C:\myFolder\myCommandFile.cmd'
DECLARE @logtable table (
    [RowId] integer IDENTITY(1,1) NOT NULL
    ,[Message] nvarchar(1024) NULL
)

INSERT INTO @logtable ([Message])
EXEC xp_cmdshell @cmdfile

SELECT *
FROM @logtable
WHERE
[Message] IS NOT NULL

/** END **/

A seconda delle opzioni di registrazione impostate per il comando ROBOCOPY è possibile visualizzare progressi, intestazioni, report o altro. Vedere la documentazione ROBOCOPY per queste opzioni. Prova anche a usare l'opzione / TEE se per prendere qualsiasi output della console dal comando ROBOCOPY.

Altri suggerimenti

Un modo in cui posso pensare di farlo è eseguire un comando batch (in modo da poter eseguire più elementi pubblicitari) con RUNAS (per impersonare un altro account utente)

È possibile acquisire l'output del file batch in un file di registro e leggerne il contenuto in SSIS utilizzando lo script.

Non sono sicuro di come scrivere nel registro SSIS e sono interessato a vedere cosa ne pensano gli altri sviluppatori.

Ho trovato due metodi round-around per ottenere dati da un'esecuzione di file batch nel database. Un metodo consiste nell'aggiungere la registrazione al file batch effettivo. Non l'ho ancora provato, ma sembra concettualmente possibile. L'altra opzione che ho provato che ha funzionato è quella di mettere l'esecuzione del file batch come passaggio del processo di SQL Server Agent e aggiungere la registrazione di file flat. Dopo averlo fatto, ho creato un piccolo pacchetto che gratta il file per messaggi specifici. Preferirei comunque una soluzione migliore, ma per ora funziona abbastanza bene.

  

Esiste un modo per eseguire un comando multilinea in un singolo Execute   Attività di processo?

Sì, utilizzare " Cmd.exe " come eseguibile Crea una variabile string con la seguente espressione (esempio):

*"/C \"start robocopy c:\\temp\\v10.2a c:\\temp\\v1 *.WRI /Z /S && start robocopy c:\\temp\\v10.2a c:\\temp\\v1 *.dll /Z /S\""*

E quindi mappare al parametro argomenti tramite l'espressione del componente. Quindi puoi eseguire quei due (o più) robocopy in //

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top