Рекомендуемое решение для сценариев файловых операций через WebDAV? - PullRequest
2 голосов
/ 29 апреля 2009

У меня есть задача: файлы, доступные через WebDAV на удаленном сервере (требуется SSL), необходимо проверить, не были ли они недавно обновлены и скопированы ли они в локальную папку. Существует ряд других действий, которые необходимо выполнить после их поступления (копирование в другие папки, обработка и т. Д.). Операционная система, с которой я работаю - Windows 2003 Server. Я бы хотел использовать PowerShell для этой задачи.

Естественно, мне нужно просмотреть файлы. Я предварительно посмотрел на несколько решений:

  • Попытка подключить диск с помощью «net use» (пока я получаю системную ошибку 67)
  • Использование такого продукта, как WebDrive, для сопоставления диска (как оказалось, WebDrive и другая утилита на сервере конфликтуют друг с другом по загадочным причинам)
  • Просматривайте файлы и манипулируйте ими, отправляя http-запросы с использованием иерархии объектов .NET HTTPWebRequest через PowerShell (работает, но кажется немного сложным)
  • Купите коммерческую сборку .NET, которая упрощает работу с WebDAV (те, которые я видел, выглядят дорогими)

Вам нужно было сделать что-то подобное? Какой подход лучше? Любой, что я пропустил? ТИА.

Ответы [ 2 ]

1 голос
/ 29 июня 2009

В качестве альтернативы PowerShell вы всегда можете сделать это из сценария WSH. Пример:

<job>
  <reference object="ADODB.Connection"/>
  <object id="cnIPP" progId="ADODB.Connection"/>
  <object id="recDir" progId="ADODB.Record"/>
  <script language="VBScript">
  Option Explicit

  Private waArgs
  Private strSubDir
  Private rsItems
  Private strLine

  Set waArgs = WScript.Arguments

  If waArgs.Count < 3 Then
    WScript.Echo "Parameters: FolderURL User PW [SubDir]"
    WScript.Quit
  End If

  cnIPP.Open "Provider=MSDAIPP.DSO;Prompt=NoPrompt;" _
           & "Connect Timeout=10;" _
           & "Data Source=" & waArgs(0), _
             waArgs(1), waArgs(2), adConnectUnspecified

  If waArgs.Count = 4 Then
    strSubDir = waArgs(3)
  Else
    strSubDir = vbNullString
  End If
  Set waArgs = Nothing

  recDir.Open strSubDir, cnIPP, adModeRead, adFailIfNotExists, _
              adDelayFetchFields Or adDelayFetchStream
  Set rsItems = recDir.GetChildren()
  With rsItems
    WScript.Echo .Fields("RESOURCE_PARENTNAME").Value
    Do Until .EOF
      If .Fields("RESOURCE_ISCOLLECTION").Value Then
        strLine = "  [DIR] " & .Fields("RESOURCE_PARSENAME").Value
      Else
        strLine = "       " _
                & " " & .Fields("RESOURCE_PARSENAME").Value _
                & " " & CStr(.Fields("RESOURCE_LASTWRITETIME").Value)

      End If
      WScript.Echo strLine
      .MoveNext
    Loop
    .Close
  End With
  Set rsItems = Nothing
  recDir.Close

  cnIPP.Close
  </script>
</job>

Пример прогона:

D:\Scripts>cscript WebDAV.wsf https://my.dav.com/~fred fred fredPW
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.

https://my.dav.com/~fred
        junk.htm 2/26/2008 4:28:44 AM
        test.log 3/30/2009 12:30:45 PM
  [DIR] _private
  [DIR] stuff

D:\Scripts>

Этот подход должен работать как с серверами с поддержкой WebDAV, так и с серверами FrontPage без изменений. В примере по умолчанию используется автоматическое согласование протокола.

Чтобы фактически получить данные, вы должны открыть ADODB.Stream в ADODB.Record, открытом в элементе, не являющемся каталогом.

1 голос
/ 01 мая 2009

Это будет работать с powershell. Обратите внимание на этот пример:

http://thepowershellguy.com/blogs/posh/archive/2008/05/31/cd-into-sysinternals-tools-from-powershell.aspx

Проблема в том, что «служба веб-клиента» не работает на сервере Windows 2003 (по умолчанию она отключена).

Подсказка была «Ошибка системы 67»

Я подтвердил это с сервера win2k3, запуск «службы веб-клиента» приведет к работе WebDAV (и, возможно, powershell). Он будет работать из коробки на клиенте XP (по умолчанию служба работает).

Дайте мне знать, если это не решит это для вас.

...