2

SSIS パッケージ内のすべての「SQL 実行タスク」の SqlStatementSource を一覧表示したいと思います。関連するものを参照すると、SQLPSX の ssis パッケージがこのタスクの解決に役立つ可能性があることがわかります。ただし、次の手順を実行しようとしています。

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

私のpowershellは次のエラーメッセージを返します:

「エラー 0xC0014037 でパッケージ保護を削除できませんでした」「パッケージはパスワードで暗号化されています。パスワードが指定されていないか、正しくありません。".これは、CPackage::LoadFromXML メソッドで発生します。"

パッケージを復号化してデータを取得するには、パスワードをインポートする必要があることが示されていますが、パスワードはどこに入力すればよいですか? または、問題を解決するための他の便利な解決策はありますか。

ベスト、デビッド

4

4 に答える 4

1

私は SQLPSX をインストールしていませんが、SQLPSX を使わずにパッケージを復号化する方法を教えてください。重要なことは、アプリケーションにパッケージ パスワードを割り当てて、パッケージを復号化できるようにすることです。

各execute sqlタスクに次のステートメントがあるこのようなパッケージを考えるSELECT N AS test どこでもSQLを実行

次のスクリプトは、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
于 2012-04-18T18:28:08.233 に答える
1

これが最善の解決策ではありませんが、試してみてください。SSIS を介して情報を取得しようとする代わりに、ファイル自体を調べてみませんか。DTSX ファイルは XML 形式であり、PowerShell はこれらのタイプのファイルをうまく処理します。

dtsx ファイルの 1 つでこれを試したところ、情報を返すことができました。


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

何らかの理由で、プロパティ「SqlTask​​Data」が見つからないという InvalidArgument エラーが発生します。これは、パッケージに含まれているデータ フロー タスクにヒットしたためだと思いますが、プロパティ/属性がありません。これは、完全な解決策ではない可能性があるという意味であり、保証はしません。指摘すべきことの 1 つは、パッケージをパスワードで暗号化するように設定していないことです。

アップデート

SSIS 用のライブラリを含む SQLPSX を試すことができます。

于 2012-04-18T15:26:52.017 に答える
0

通常、DTEXEC を使用して、次のように暗号化されたパッケージを実行します。

DTExec.exe /FILE "C:\Package1.dtsx" /DECRYPT password@1.

/FILE は、パッケージがファイル システム上にあることを意味します。ファイル ストア上にある場合は、/SQL を SQL Server データベース上のパッケージに使用するか、/DT を使用します。

また、BIDS でパッケージを開くと、パスワードの入力を求めるプロンプトが表示されます。

于 2012-04-18T10:07:31.137 に答える
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;
        }
    }
}
于 2012-05-21T03:36:49.623 に答える