SSIS WMI Event Watcher如何查询网络文件夹?

问题描述:

我想在SSIS中做的事情是有一个WMI事件观察器任务,它监视要创建的文件的文件夹,然后用它做一些事情。主要部分是“观看文件创建的文件夹”。SSIS WMI Event Watcher如何查询网络文件夹?

我有一个网络文件夹(完整路径):\\srvblah10\main\child\target\

所有的网站我已经到了这个作为一个例子:

SELECT * FROM __InstanceCreationEvent WITHIN 10 
WHERE TargetInstance ISA "CIM_DirectoryContainsFile" 
AND TargetInstance.GroupComponent = "Win32_Directory.Name=\"d:\\\\NewFiles\"" 

由于该文件夹是一个网络文件夹,我可以不提供物理盘符。那么有没有办法使用类似的WQL查询,但对于网络文件夹路径而不是物理文件夹路径?

你必须用DOS命令映射驱动器: 网使用S:\ srvblah10 \主\孩子\目标\ /用户dotnetN00b为Pa $$字

,那么你可以将WMI Event Watcher Task观看。

我正在尝试做一段时间,最后放弃尝试使用SSIS WMI事件观察器任务,并且只是在脚本任务中写入了等价物。面临的挑战是让WMI Event Watcher通过配置部分(而不是硬编码到包)中的特定用户凭证进行远程连接。

第二个不会使用脚本困难的问题是将网络共享简单地转换为Event Watcher所需的服务器上的本地路径名。你会从下面的脚本中看到,所有的事情都是以最小的努力完成的。

只需要额外提醒一下,确保包含脚本在ReadOnlyVariables中使用的DTS.Variables(正常情况)。下面的代码需要三个DTS变量,例如,如果你想观看在以下位置\哥白尼\送货\ SAP \被丢弃的文件导入,那么你会设置的变量,如下图所示:

  • 用户::服务器名称 - 网络共享 (送货)名称
  • - 其中份额住 ( 哥白尼
  • 用户::共享名服务器的主机名
  • 用户:: ImportPath - 该目录的目录路径 手表新文件(/SAP /导入


public void Main() 
{ 
string localPath = ""; 

    try 
    { 
     ConnectionOptions connection = new ConnectionOptions(); 
     connection.Username = "<valid username here>"; 
     connection.Password = "<password here>"; 
     connection.Authority = "ntlmdomain:<your domain name here>"; 

     ManagementScope scope = new ManagementScope(@"\\" + Dts.Variables["User::FileServerName"].Value.ToString() + @"\root\CIMV2", connection); 
     scope.Connect(); 

     /// Retrieve the local path of the network share from the file server 
     /// 
     string queryStr = string.Format("SELECT Path FROM Win32_Share WHERE Name='{0}'", Dts.Variables["User::ShareName"].Value.ToString()); 
     ManagementObjectSearcher mosLocalPath = new ManagementObjectSearcher(scope, new ObjectQuery(queryStr)); 
     foreach (ManagementObject elements in mosLocalPath.Get()) 
     { 
      localPath = elements["Path"].ToString(); 
     } 

     queryStr = string.Format(
      "SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' and TargetInstance.GroupComponent=\"Win32_Directory.Name='{0}{1}'\"", 
      localPath.Replace(@"\", @"\\"), 
      Dts.Variables["User::ImportPath"].Value.ToString().Replace(@"\", @"\\")); // query requires each seperator to be a double back slash 

     ManagementEventWatcher watcher = new ManagementEventWatcher(scope, new WqlEventQuery(queryStr)); 

     ManagementBaseObject eventObj = watcher.WaitForNextEvent(); 

     // Cancel the event subscription 
     watcher.Stop(); 

     Dts.TaskResult = (int)ScriptResults.Success; 
    } 
    catch (ManagementException err) 
    { 
     Dts.Events.FireError((int)err.ErrorCode, "WMI File Watcher", "An error occurred while trying to receive an event: " + err.Message, String.Empty, 0); 
     Dts.TaskResult = (int)ScriptResults.Failure; 
    } 
    catch (System.UnauthorizedAccessException unauthorizedErr) 
    { 
     Dts.Events.FireError((int)ManagementStatus.AccessDenied, "WMI File Watcher", "Connection error (user name or password might be incorrect): " + unauthorizedErr.Message, String.Empty, 0); 
     Dts.TaskResult = (int)ScriptResults.Failure; 
    } 

}