SSIS C#Script读取Windows注册表项时出错

时间:2013-07-23 15:16:10

标签: c# sql-server ssis

我有一个很大的问题,我甚至不知道要检查什么。    我有一个很大的SSIS包,它在开始时运行一个“执行脚本”任务(名为ST_2275f0b3eced4c84bd35d4c826cab866.csproj),用C#编写,看起来像这样:

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using Microsoft.Win32;

namespace ST_2275f0b3eced4c84bd35d4c826cab866.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
public void Main()
        {

            Dts.Variables["user_uca"].Value = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\TDCredentials").GetValue("user_uca").ToString();

            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
}

底线是它使用来自特定Windows注册表项的数据加载SSIS包变量。 问题是,当我从Visual Studio运行SSIS包时,它可以工作。但是,当我运行为该SSIS包生成的Sql代理作业时,它给出了错误: System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---> System.NullReferenceException:未将对象引用设置为对象的实例。在ST_2275f0b3eced4c84bd35d4c826cab866.csproj.ScriptMain.Main() 此错误表示Windows注册表项不存在。因为如果我故意删除特定的Windows注册表项,然后从Visual Studio运行SSIS包,我会收到确切的错误消息。 我已经检查了所有我能做的事情:sql server和拥有那些Windows注册表项的主机 - 它们是相同的。此外,我为这些键授予了“Everyone”权限,我也把密钥放在HKLocalMachine中,以确保它们对所有用户都存在,但仍然是同样的错误。 任何提示?! 提前谢谢,波格丹。

2 个答案:

答案 0 :(得分:1)

问题最终是权限问题。运行SQL代理的服务帐户或运行SSIS的子系统作业步骤的凭据无法读取该部分注册表。

您需要授予该用户访问权限或创建可以从注册表中读取的委托。

作为旁注,您不必使用脚本方法。读取注册表值并将它们分配给变量是SSIS中的本机功能。有关该主题的更多信息,请参阅Configurations。您仍然需要处理权限问题,但是您不会在整个软件包中复制和粘贴代码。

答案 1 :(得分:0)

如上所述,这是运行sql代理作业的帐户的权限问题。     因此,解决方案首先要制作一个新的凭证,来自“凭证” - > “新证书”。在“身份”字段中,我选择具有sysadmin权限的用户(例如john.doe)。在“Credential name”字段中,我填写了“John”。然后从Sql Server Agent - >代理 - > SSIS包执行我创建了“新代理”。我填写了“代理名称”一个名称(ProxyJohn),在“凭据名称”我选择了早期定义的凭证,“John”,然后在字段“Active to the following subsystems”我检查了“Sql Server Integration Services Package”选项。     然后,在我的Sql Server Agent - >乔布斯,在我的工作上(在跑步时给了我错误信息),在礼仪中 - >步骤 - > “运行方式”我选择了上面创建的新凭据,名为“ProxyJohn”而不是“Sql Server代理服务帐户”(默认情况下)     它就像一个魅力。

希望它会有所帮助。 最好的问候,波格丹