【问题标题】:Recommended solution for scripting file operations over WebDAV?通过 WebDAV 编写文件操作脚本的推荐解决方案?
【发布时间】:2023-07-11 02:46:01
【问题描述】:

我有一个任务:必须检查远程服务器上通过 WebDAV 可用的文件(需要 SSL),以确定它们最近是否已更新,如果已更新,则将其复制到本地文件夹。在它们到达后还需要执行许多其他操作(复制到其他文件夹、处理等)。我使用的操作系统是 Windows 2003 Server。我希望能够使用 PowerShell 来完成这项任务。

当然,我需要浏览文件。我已经初步研究了几种解决方案:

  • 尝试使用“网络使用”映射驱动器(到目前为止,出现系统 67 错误)
  • 使用像 WebDrive 这样的产品来映射驱动器(碰巧,WebDrive 和服务器上的另一个实用程序似乎因神秘原因相互冲突)
  • 通过 PowerShell 使用 .NET HTTPWebRequest 对象层次结构发出 http 请求来浏览和操作文件(可行,但似乎有点复杂)
  • 购买可简化 WebDAV 使用的商业 .NET 程序集(我见过的看起来很贵)

您是否需要做类似的事情?哪种方法最好?我错过了什么? TIA。

【问题讨论】:

  • 我也很好奇这个。 SharePoint 的 Actions->View as Explorer 选项以某种方式使这项工作,即使通过 SSL 和非标准端口,但我不知道如何。

标签: powershell webdav


【解决方案1】:

它将在 powershell 中运行。注意这个例子:

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

问题是“web 客户端服务”没有在 windows 2003 服务器上运行(默认情况下它被禁用)。

线索是"System 67 error"

我从 win2k3 服务器确认了这一点,启动“网络客户端服务”将使 WebDAV 工作(可能还有 powershell)。它可以在 XP 客户端上开箱即用(服务默认运行)。

如果这不能为您解决问题,请告诉我。

【讨论】:

  • 谢谢!碰巧,我还不能对此进行测试(需要获得 IT 团队的许可),但是一个很好的提示。
【解决方案2】:

作为 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.Record 上打开 ADODB.Stream。

【讨论】:

    最近更新 更多