【问题标题】:How do I SSIS WMI Event Watcher Query for a network folder?如何对网络文件夹进行 SSIS WMI 事件观察程序查询?
【发布时间】:2014-06-06 15:54:28
【问题描述】:

我在 SSIS 中尝试做的是有一个 WMI 事件观察器任务,它观察要创建的文件的文件夹,然后用它做一些事情。主要部分是“监视文件夹以创建文件”。

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

我去过的所有网站都有这个例子:

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

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

【问题讨论】:

    标签: ssis wmi wmi-query


    【解决方案1】:

    您必须使用 dos 命令映射驱动器: net use s: \srvblah10\main\child\target\ /user dotnetN00b Pa$$word

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

    【讨论】:

      【解决方案2】:

      我尝试了一段时间,最后放弃了尝试使用 SSIS WMI Event Watcher 任务,只是在脚本任务中编写了等效项。挑战的问题是让 WMI 事件观察器使用我想从配置部分获取的特定用户凭据进行远程连接(而不是硬编码到包中)。

      使不使用脚本变得困难的第二个问题是将网络共享简单地转换为服务器上的本地路径名,这是事件观察器所需要的。您会从下面的脚本中看到,一切都是以最少的努力完成的。

      请注意,请确保在 ReadOnlyVariables 中包含脚本使用的 DTS.Variables(正常情况下)。下面的代码需要三个 DTS 变量,例如,如果您尝试监视以下位置 \copernicus\dropoff\SAP\Import 中的文件,那么您将设置变量,如下所示:

      • User::ServerName - 共享所在服务器的主机名 (哥白尼)
      • User::ShareName - 网络共享的名称 (下车
      • User::ImportPath - 目录的目录路径 留意 (/SAP/Import) 中的新文件


      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;
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多