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查询,但对于网络文件夹路径而不是物理文件夹路径?
答
我正在尝试做一段时间,最后放弃尝试使用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;
}
}