2012-04-18 9 views
2

SSISパッケージのすべての "Execute SQL Task"のSqlStatementSourceをリストしたいと思います。関連性を参照すると、SQLPSXのssisパッケージがこのタスクを解決するのに役立つことが示されます。しかし 、私は、次の手順を実行しようとしていながら:list SqlStatementSourceのすべての "Execute SQL Task"をSSISパッケージ

パッケージがパスワードで暗号化された「エラー0xC0014037でパッケージの保護を解除に失敗しました」:

import-module SSIS 
$package = Get-ISPackage -path "xxx.dtsx" 

私のPowerShellはのエラーメッセージが返されます。パスワードが指定されていないか、または正しくありません。 "これはCPackage :: LoadFromXMLメソッドで発生します。

これは、データを取得するためにパスワードをインポートする必要があることを示していますが、パスワードはどこに置く必要がありますか?または、私が問題を解決するための他の便利な解決策がありますか?

ベスト、あなたは通常、このような暗号化されたパッケージを実行するためにDTEXECを使用 デビッド

+0

提供された回答を評価する機会はありましたか? – billinkc

答えて

0

DTExec.exe /FILE "C:\Package1.dtsx" /DECRYPT [email protected] 

/FILEは、パッケージがファイルシステム上にあることを意味します。それはファイルストアに

ある場合は、このことをあなたがBIDSでパッケージを開くと、パスワードの入力が求められなければならない。また、SQL Serverデータベースまたは/ DTのパッケージに

1

を/ SQLを使用していないだろう最高の解決策ですが、試してみてください。情報を入手するためにSSISを通過しようとするのではなく、ファイル自体を調べてみてください。 DTSXファイルはXML形式であり、PowerShellはこれらのタイプファイルで十分に機能します。

私は私のdtsxファイルの一つでこれをしようとした情報を返すことができた:


[xml]$package = Get-Content C:\Myfile.dtsx 
$package.Executable.Executable | 
    Select -ExpandProperty ObjectData | 
     Select -ExpandProperty SqlTaskData | 
     Select SqlStatementSource 

私はInvalidArgumentエラーが「SqlTask​​Data」それが財産を見つけることができないと言っ取得しないいくつかの理由。私はこれがパッケージ内にあるデータフロータスクに当たっていると思いますし、プロパティ/属性はありません。これは完璧な解決策ではないかもしれないという意味であり、保証はありません。私のパッケージはパスワードで暗号化されるように設定されていません。

更新

あなたは、SSISのためSQLPSX that include a libraryを試してみてください。

1

私はSQLPSXをインストールしていませんが、それを使わないでパッケージの解読方法を教えていただけます。重要なことは、アプリケーションにパッケージパスワードを割り当て、パッケージを解読できるようにすることです。各sqlタスクを実行し、このようなパッケージを考える

SELECT N AS test execute sql everwhere

の声明を持って次のスクリプトは、EncryptAllWithPasswordとして保存されたパッケージを復号化し、さまざまなコンテナに埋め込まれたいくつかのタスクでの品揃えを持っています。それは美しいPowerShellではありませんが、それは仕事を完了します。

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SQLServer.ManagedDTS") | out-null 

Function ProcessExecutable 
{ 
    param 
    (
    [Microsoft.SqlServer.Dts.Runtime.Executable]$item 
    ) 

    $t = $item.GetType() 
    if ($t.Name -eq "TaskHost") 
    { 
     #$th = New-Object Microsoft.SqlServer.Dts.Runtime.Task 
     #$es = New-Object Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask 
     $th = [Microsoft.SqlServer.Dts.Runtime.TaskHost]$item 
     try 
     { 
      $es = [Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask]$th.InnerObject 
      Write-Host($es.SqlStatementSource) 
     } 
     catch 
     { 
     } 
    } 
    elseif ($t.Name -eq "Sequence") 
    { 
     $sequence = [Microsoft.SqlServer.Dts.Runtime.Sequence]$item 
     foreach ($subitem in $sequence.Executables) 
     { 
      ProcessExecutable $subitem 
     } 
    } 
    elseif ($t.Name -eq "ForLoop") 
    { 
     $sequence = [Microsoft.SqlServer.Dts.Runtime.ForLoop]$item 
     foreach ($subitem in $sequence.Executables) 
     { 
      ProcessExecutable $subitem 
     } 
    } 
    elseif ($t.Name -eq "ForEachLoop") 
    { 
     $sequence = [Microsoft.SqlServer.Dts.Runtime.ForEachLoop]$item 
     foreach ($subitem in $sequence.Executables) 
     { 
      ProcessExecutable $subitem 
     } 
    }  
} 


$app = New-Object Microsoft.SqlServer.Dts.Runtime.Application 
$app.PackagePassword = "password" 
$packagePath = "C:\sandbox\SSISHackAndSlash\SSISHackAndSlash\Encrypted.dtsx" 
$package = $app.LoadPackage($packagePath, $null) 

foreach($item in $package.Executables) 
{ 
    ProcessExecutable $item 
} 

出力リレー

SELECT 1 AS test 
SELECT 2 As test 
SELECT 5 AS test 
SELECT 4 AS test 
SELECT 3 AS test 
0

すべてのSSISコンポーネントを一覧表示する方法についての情報をオンラインで検索した後、私はC#のプログラムは、問題を解決するための最善の解決策かもしれない書き込みを見つけました。したがって、以下で私は自分の仕事を終わらせるためにVS 2008互換プログラムを書きました。 以下は、SSIS関連のコンポーネントをすべて一覧表示するプログラムを作成し、その結果をExcelファイルに書き込むものです。このソリューションを使用すると、VS 2008で表示されるコンポーネントをクリックする時間を大幅に節約し、コンポーネントプロパティを1つずつ表示できます。私はC#の専門家ではないので、プログラムはうまくコーディングされていないかもしれません。しかし、少なくともそれは動作します!

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 
using Excel = Microsoft.Office.Interop.Excel; 
using System.Reflection; 
using Microsoft.SqlServer.Dts.Runtime; 
using Microsoft.SqlServer.Dts.Pipeline; 
using Microsoft.SqlServer.Dts.Pipeline.Wrapper; 


namespace Project1 
{ 
    public class SSISFinder 
    { 

     public static void Main() 
     { 
      // Set ssis app 
      Microsoft.SqlServer.Dts.Runtime.Application ssisApp = new Microsoft.SqlServer.Dts.Runtime.Application(); 
      ssisApp.PackagePassword = "admin_monkey4ccc"; 

      // Loading dtsx package 
      Package pkg = ssisApp.LoadPackage("D:\\SummaryETL.dtsx", null); 

      // Open Excel Sheet 
      Excel.Application oXL = new Excel.Application(); 
      Excel.Workbook oWB; 
      Excel.Worksheet oSheet;    
      string fileName = "D:\\test.xls"; 
      oWB = oXL.Workbooks.Add(Missing.Value); 
      oSheet = (Excel.Worksheet)oWB.ActiveSheet; 

      // List data flow package 
      List<DtsContainer> containers = FindExecutablesByType((IDTSSequence)pkg, "PIPELINE"); 
      int counter = 1; 

      foreach (DtsContainer exec in containers) 
      { 
       TaskHost th = exec as TaskHost; 
       MainPipe pipe = (MainPipe)th.InnerObject; 

       foreach (IDTSComponentMetaData100 comp in pipe.ComponentMetaDataCollection) 
       { 
        if (comp.Description == "OLE DB Source") 
        { 
         oSheet.Cells[counter, 1] = comp.Description; 
         oSheet.Cells[counter, 2] = th.Properties["Name"].GetValue(th).ToString(); 
         oSheet.Cells[counter, 3] = comp.Name;      
         oSheet.Cells[counter, 4] = comp.CustomPropertyCollection["SqlCommand"].Value; 
         Console.WriteLine(" Component Name = " + comp.Name); 
         counter++; 
        } 
        else if (comp.Description == "OLE DB Destination") 
        { 
         oSheet.Cells[counter, 1] = comp.Description; 
         oSheet.Cells[counter, 2] = th.Properties["Name"].GetValue(th).ToString(); 
         oSheet.Cells[counter, 3] = comp.Name;      
         oSheet.Cells[counter, 4] = comp.CustomPropertyCollection["OpenRowset"].Value; 
         Console.WriteLine(" Component Name = " + comp.Name); 
         counter++; 
        } 
       } 

      } 

      oWB.SaveAs(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Excel.XlSaveAsAccessMode.xlShared, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
      oWB = null; 

      oXL.Quit(); 
      oXL = null; 

     } 

     static List<DtsContainer> FindExecutablesByType(IDTSSequence sequence, string typeName) 
     { 
      string typeNameUpper = typeName.ToUpper(); 
      List<DtsContainer> matchingExecutable = new List<DtsContainer>(); 
      foreach (Executable e in sequence.Executables) 
      { 
       if (e.GetType().ToString().ToUpper().Contains(typeNameUpper)) 
       { 


        matchingExecutable.Add((DtsContainer)e); 
       } 
       if (e is TaskHost) 
       { 
        TaskHost taskHost = (TaskHost)e; 

        if ((typeNameUpper.Contains("DATA FLOW") 
           || typeNameUpper.Contains("DATAFLOW") 
           || typeNameUpper.Contains("MAINPIPE") 
           || typeNameUpper.Contains("PIPELINE") 
           ) && taskHost.InnerObject is IDTSPipeline100 
         ) 
        { 
         matchingExecutable.Add((DtsContainer)e); 
        } 
        else if (taskHost.InnerObject.GetType().ToString().ToUpper().Contains(typeNameUpper)) 
        { 
         matchingExecutable.Add((DtsContainer)e); 
        } 
       } 
       if (e is IDTSSequence) 
       { 
        matchingExecutable.AddRange(FindExecutablesByType((IDTSSequence)e, typeNameUpper)); 
       } 
      } 
      return matchingExecutable; 
     } 
    } 
} 
関連する問題