Мы находимся в доменной среде Windows 7 / Server 2008 R2. У нас есть приложение .NET с множеством внутренних библиотек для различных пользовательских интерфейсов и других функций. Мы развертываем его из общего ресурса, где для каждого «выпуска» создается каталог с номером последней версии. Иногда есть отделы, которым нужно что-то доработать в приложении для их конкретных нужд, и они нуждаются в срочном изменении до следующего выпуска. Мы можем сделать это, предоставив им некоторое количество пользовательских DLL-файлов с запрошенными изменениями в них. Я пытаюсь разработать наиболее надежный и эффективный способ, чтобы наши клиентские машины автоматически проверяли и копировали эти «пользовательские» файлы. Я хочу сделать это наиболее эффективным, надежным, централизованно управляемым способом и с наименьшими накладными расходами для клиентов. Предпочтительно, когда у нас есть собственные файлы для развертывания, мы хотели бы, чтобы все клиенты скопировали их в течение 24 часов после того, как мы разместим их в общей папке. Они будут помещаться в подпапку текущего сетевого каталога выпуска с именем «Custom» или чем-то подобным. В настоящее время у нас нет SCCM, поэтому я рассматриваю следующие варианты:
Сценарий входа в пакетный файл для пользователей, который будет проверять сетевой каталог и копировать (перезаписывать) локальные файлы с помощью robocopy или xcopy. Это потребует от пользователя выхода и повторного входа, поэтому может возникнуть задержка в получении любых пользовательских файлов. У пользователей будет простой и надежный способ вызвать его, так что это будет плюсом.
Запланированная задача, настроенная с помощью элемента предпочтений групповой политики, для проверки сетевого каталога, возможно, несколько раз в день на наличие каких-либо настраиваемых файлов. Это может получить файл быстрее, чем сценарий входа пользователя в систему, но у меня нет опыта работы с элементами запланированных задач GPP. Насколько он надежен и прост в настройке и обслуживании? Опять же, эта задача будет запускать пакетный сценарий для проверки файлов в сети и запускать robocopy с параметром / xo. Если мы поместим какие-либо файлы в пользовательский каталог, мы предположим, что они необходимы, независимо от версии. Простая проверка дат файлов должна работать, поэтому они не будут повторно копироваться снова и снова, как только они будут на месте.
Запланированная задача такая же, как указано выше, но запускается на основе записи журнала событий. Это надежно? Никогда не пробовал. Было бы полезно найти триггер события, который указывал бы, что приложение было только что запущено (или закрыто), а затем сразу же скопировать файлы, чтобы уменьшить вероятность прерывания работы пользователя.
Я знаю, что есть также элемент предпочтений групповой политики для управления / копирования файлов. Я считаю, что в этом случае было бы слишком много работы, потому что одновременно может быть несколько файлов в нескольких версиях приложения.
Я также рассматривал сценарий Powershell, который может делать интересные вещи, например сравнивать фактические версии файлов DLL и т. Д., Но это, вероятно, потребует дополнительных затрат ресурсов (работает медленнее) и действительно делает больше, чем необходимо.
Есть ли другие идеи о том, что может работать лучше всего? Самый простой ответ (сценарий входа в систему) действительно лучший?
В итоге я выбрал вариант №1, сценарий входа в систему, и уже некоторое время он надежно работает. Я бы разместил здесь весь сценарий, но он полон внутренних деталей приложения, которые делают его практически бесполезным для общего использования. Самая интересная деталь заключается в том, что мы используем wmic для получения внутреннего номера версии локально установленного приложения и используем его для ссылки на каталог правильной версии на нашем сервере развертывания. Этот код устанавливает переменную с именем Version в соответствии со значением, возвращаемым из wmic.exe.
set "myfile=c:\\progra~2\\%AppFolder%\\AppName.exe"
for /f "tokens=*" %%f in ('wmic datafile where "name='%myfile%'" get version /value ^| findstr "="') do set "%%f"