Вызов Shell32 GetDetailsOf в SSIS, возвращающий разные результаты при запуске вручную и на сервере - PullRequest
3 голосов
/ 03 августа 2020

В пакете SSIS у меня есть задача сценария, которая пытается получить информацию об авторе для файла. При запуске из Visual Studio код работает должным образом, возвращая информацию об авторах из метаданных файла. При запуске на сервере в качестве запланированного задания для того же файла информация об авторах не найдена.

private static void GetDocAuthor(object param)
{

    try
    {
        DocAuthor = "Unknown";

        object[] args = (object[])param;
        string folderPath = (string)args[0];
        string fileName = (string)args[1];

        fileName = fileName.Trim('\\');

        // Filename: Column 0
        // Authors: Column 20

        var folder = new Shell32.Shell().NameSpace(folderPath);

        foreach (Shell32.FolderItem item in folder.Items())
        {
            string retrievedFilename = folder.GetDetailsOf(item, 0);

            if (retrievedFilename == fileName)
            {
                DocAuthor = folder.GetDetailsOf(item, 20);

            }
        }

    }
    catch (Exception ex)
    {
        using (EventLog eventLog = new EventLog("Application"))
        {
            eventLog.Source = "Application";
            eventLog.WriteEntry(string.Format("Error getting Authors. Error message = {0}", ex.Message), EventLogEntryType.Information, 107);
        }
    }
}


Метод GetDocAuthor выполняется как поток STA, поскольку я читал о том, что COM-объект оболочки не работает в SSIS из-за того, что он запускается как поток MTA. Вот как это называется:

object[] args = new object[] { folderPath, fileName };

Thread staThread = new Thread(new ParameterizedThreadStart(GetDocAuthor));
staThread.SetApartmentState(ApartmentState.STA);
staThread.Start(args);
staThread.Join();

folderPath - это папка, в которой находится файл, о котором я хочу получить информацию. fileName - это имя указанного c файла, автор которого мне нужен.

folderPath - это UN C путь, поэтому я не ожидаю, что быть проблемой. Мне не хватает чего-то, что должно отличаться от того, когда оно выполняется локально, а не на сервере. При запуске на сервере скрипт может найти файл, он просто не может получить метаданные.

У кого-нибудь есть направление для изучения?

После проведения еще нескольких тестов между локальным и серверным исполнением вот что я знаю:

Пакет SSIS работает в 32-битном режиме как локально, так и на сервере.

Локально он работает в VS 2017 на Windows 10. На сервере он работает на SQL server 2014 на Windows Server 2012 R2.

Используя ведение журнала некоторых приложений, я определил, что GetDetailsOf (item, 10) одинаков на обоих компьютерах, являясь идентификатором пользователя NT для человека, создавшего файл, а для GetDetailsOf (item, 20) содержит информацию об авторе на Windows 10, но на Windows сервере пусто. 2012 R2.

К сожалению, идентификатор пользователя NT мне не нужен, это информация об авторе.

Похоже, проблема связана с тем, что доступно на Windows Server 2012 R2, а не сам файл. Может ли кто-нибудь подтвердить, что метаданные авторов недоступны на Server 2012?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...