[SSIS] UNC Batch/Exe: Security Warning - The publisher could not be verified. Are you sure you want to run this software ?

access_time 8 years ago visibility948 comment 0

背景

在Windows系统中,当我们从共享路径或者未信任的网络允许可执行程序时,如果程序未签名那么系统就会提示是否允许执行程序;只有当允许后,程序才能继续执行。当我们需要在一些自动化运行解决方案中调用此类未签名程序时,则会遇到麻烦,因为无法交互。在以前一个SSIS项目中,我们则遇到了类似的麻烦:在SSIS的Package中,需要调用一个放置于共享文件夹中的未签名的Console程序(通过Process类)或者直接添加Execute Process Task,任务则会失败(当通过Agent Job 或者其它调度程序调用时)。

Open File – Security Warning

The publisher could not be verified. Are you sure you want to run this software ?

Name: *.*

Publisher: Unknown

Type: Windows Batch file

 

本文将介绍解决此类问题的一种解决方案(在一些情况下我们无法签名程序或者修改IE安全属性):通过AppDomain来调用控制台程序,绕过Windows的对话框。

另外的解决方法是将程序用受信任的证书签名或者直接设置IE的安全属性,这里不详细介绍:

Internet Options -> Security -> Trusted sites - add \\serverName to trusted sites list.
in "Security level for this zone" - Custom level... -> Miscellaneous -> Launching applications and unsafe files -> Enable

创建Console 程序TestConsole

代码如下:

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Test");
        }
     }

生成应用程序,并共享TestConsole.exe。在我机器上,共享文件夹为“\\192.168.1.102\TestConsole”,其中包含TestConsole.exe可执行程序。

创建SSIS项目TestSSIS

运行SQL Server Data Tool,选择Business Intelligence,创建SSIS项目。

image

在默认添加的Package.dtsx中,添加一个Execute Process Task,设置Executable属性为“\\192.168.1.102\TestConsole\TestConsole.exe”,如下图所示:

image

运行任务则会提示:

image

如果在Agent Job中允许,同时无法交互,那么最终此任务会失败,抛出类似的信息:

The process exit code was "***" while the expected was "0".

通过Script Task解决此问题

如背景中描述,在一些情况下,我们无法修改IE安全设置,那么以下这个方式则可以轻松的解决这个问题。

删除Execute Process Task,新建C# Script Task,主要代码如下:

public void Main()
        {
            // TODO: Add your code here
            try
            {
                ExecuteApp();
                Dts.TaskResult = (int)ScriptResults.Success;
            }
            catch
            {
                Dts.TaskResult = (int)ScriptResults.Failure;
            }

        }

        private void ExecuteApp()
        {
            string path = @"\\192.168.1.102\TestConsole\TestConsole.exe";
            string dir = Path.GetDirectoryName(path);
            AppDomain currentDomain = AppDomain.CurrentDomain;
            AppDomain subDomain = AppDomain.CreateDomain("TestConsole", null, currentDomain.SetupInformation, new System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted));
            subDomain.ExecuteAssembly(path);
        }

 

其中的new System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted)设置尤为重要。

运行Script Task则会成功执行,而不会提示安全警告:

image

总结

这种解决方案,绕过了IE浏览器安全设置,同时也无需被调用程序使用受信任的证书签名,大家可以参考使用。

info Last modified by Raymond 7 years ago copyright This page is subject to Site terms.
Like this article?
Share on

Please log in or register to comment.

account_circle Log in person_add Register

Log in with external accounts

Follow Kontext

Get our latest updates on LinkedIn or Twitter.

Want to publish your article on Kontext?

Learn more

More from Kontext

visibility 970
thumb_up 0
access_time 11 years ago

我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我们依然可以通过对联合主键中的首列除外的其他列建立非聚集索引来提高性能。关于索引,可以参考我的这篇文章:http://hi.baidu.com/1987raymond/blog/item/a0f7b11062e1330a213f2e26.html

visibility 372
thumb_up 0
access_time 13 years ago

恢复数据库的时候遇到这个错误解决办法

visibility 948
thumb_up 0
access_time 8 years ago

在Windows系统中,当我们从共享路径或者未信任的网络允许可执行程序时,如果程序未签名那么系统就会提示是否允许执行程序;只有当允许后,程序才能继续执行。当我们需要在一些自动化运行解决方案中调用此类未签名程序时,则会遇到麻烦,因为无法交互。在以前一个SSIS项目中,我们则遇到了类似的麻烦:在SSIS的Package中,需要调用一个放置于共享文件夹中的未签名的Console程序(通过Process类)或者直接添加Execute Process Task,任务则会失败(当通过Agent Job 或者其它调度程序调用时)。 Open File – Security Warning The ...