Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 在UNC路径\\SERVERNAME的根目录下使用Get-Childitem_Powershell_Get Childitem_Network Shares - Fatal编程技术网

Powershell 在UNC路径\\SERVERNAME的根目录下使用Get-Childitem

Powershell 在UNC路径\\SERVERNAME的根目录下使用Get-Childitem,powershell,get-childitem,network-shares,Powershell,Get Childitem,Network Shares,我们正在尝试将PowerShell用作文件复制工具,但存在问题 源服务器是基于Linux的封闭式操作系统,用户通过GUI创建多个网络共享,然后通过UNC路径\\SERVERNAME\NETWORKSHARE访问这些网络共享。当然,在操作系统中,NETWORKSHARE实际上位于比根更深的多个级别 我们已经和操作系统的开发人员谈过,他们不能/不会启用对存储所有NETWORKSHARE文件夹的文件夹根目录的访问 我已转向PowerShell,试图找到一种方法。我最初的想法是发送一个Get Child

我们正在尝试将PowerShell用作文件复制工具,但存在问题

源服务器是基于Linux的封闭式操作系统,用户通过GUI创建多个网络共享,然后通过UNC路径
\\SERVERNAME\NETWORKSHARE
访问这些网络共享。当然,在操作系统中,NETWORKSHARE实际上位于比根更深的多个级别

我们已经和操作系统的开发人员谈过,他们不能/不会启用对存储所有NETWORKSHARE文件夹的文件夹根目录的访问

我已转向PowerShell,试图找到一种方法。我最初的想法是发送一个
Get ChildItem-Directory
\\SERVERNAME
以获取所有网络共享,然后通过管道将其传输到
Copy Item/Robocopy
,但它不起作用

我知道服务器需要自己的本地(非AD)凭据

有没有一种方法可以做我想做但却看不见的事情


提前谢谢

带有IP的
net view
命令将枚举可访问的SMB/Samba共享。
此PowerShell脚本解析输出并返回带有服务器和共享属性的
[PSCustomObject]

## Enum-SambaShares.ps1
$ServerList = ('192.168.133.67','192.168.133.46','192.168.133.76','192.168.133.28')
$ServerShares = ForEach ($Server in $ServerList) {
    net view "\\$Server" 2>$Null | Select-String '^([^ ]+)\s+(Disk|Platte)' | 
        ForEach-Object {
            [PSCustomObject]@{
                Server = $Server
                Share  = $_.matches.groups[1].Value
            }
        }
}
$ServerShares
样本输出:

Server        Share
------        -----
192.168.133.67 Backup
192.168.133.67 Daten
192.168.133.67 Video-Unc
192.168.133.46 SambaShare
192.168.133.46 UserName
192.168.133.76 C
192.168.133.28 McDaten
192.168.133.28 Music
192.168.133.28 UserName

解析
新视图的输出有点笨拙。下面是一种直接从PowerShell调用
NetShareEnum
Win32 API并将结果作为对象输出的方法:

# Get-NetShare.ps1

#requires -version 2

param(
  [String] $ComputerName = "."
)

Add-Type @"
using System;
using System.Runtime.InteropServices;
using System.Text;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SHARE_INFO_1
{
  [MarshalAs(UnmanagedType.LPWStr)]
  public string shi1_netname;
  public uint shi1_type;
  [MarshalAs(UnmanagedType.LPWStr)]
  public string shi1_remark;
}
public static class NetApi32
{
  [DllImport("netapi32.dll", SetLastError = true)]
  public static extern int NetApiBufferFree(IntPtr Buffer);
  [DllImport("netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
  public static extern int NetShareEnum(
    StringBuilder servername,
    int level,
    ref IntPtr bufptr,
    uint prefmaxlen,
    ref int entriesread,
    ref int totalentries,
    ref int resume_handle);
}
"@

$pBuffer = [IntPtr]::Zero
$entriesRead = $totalEntries = $resumeHandle = 0
$result = [NetApi32]::NetShareEnum(
  $ComputerName,        # servername
  1,                    # level
  [Ref] $pBuffer,       # bufptr
  [UInt32]::MaxValue,   # prefmaxlen
  [Ref] $entriesRead,   # entriesread
  [Ref] $totalEntries,  # totalentries
  [Ref] $resumeHandle   # resumehandle
)
if ( ($result -eq 0) -and ($pBuffer -ne [IntPtr]::Zero) -and ($entriesRead -eq $totalEntries) ) {
  $offset = $pBuffer.ToInt64()
  for ( $i = 0; $i -lt $totalEntries; $i++ ) {
    $pEntry = New-Object IntPtr($offset)
    $shareInfo = [Runtime.InteropServices.Marshal]::PtrToStructure($pEntry, [Type] [SHARE_INFO_1])
    $shareInfo
    $offset += [Runtime.InteropServices.Marshal]::SizeOf($shareInfo)
  }
  [Void] [NetApi32]::NetApiBufferFree($pBuffer)
}
if ( $result -ne 0 ) {
  Write-Error -Exception (New-Object ComponentModel.Win32Exception($result))
}
您可以通过以下方式获得远程计算机的磁盘共享:

Get-NetShare sambaservername | Where-Object { $_.shi1_type -eq 0 }

对这几乎正是我所需要的。结果非常完美,但缺少的一点是,我需要这个脚本以远程服务器上的本地用户的身份访问远程服务器,我该怎么做呢?你可以使用
net use
对服务器进行身份验证,但这需要一个共享
net use\\server\share/user:test testpassword
是的,我知道这一点,因此提出了我的问题。我需要使用远程服务器凭据来访问根目录,如果服务器是.Welp,那就不用管这个问题了。无法将凭据传递到Net View,但是,我可以手动将凭据添加到凭据管理器,现在一切似乎都正常了。稍后将不得不在另一个VM上进行最后的尝试。感谢您的帮助,这将为我们节省大量的时间和服务器备份时间!这将是完美的,但源操作系统是基于Linux的,而不是基于Windows的,因此在另一端没有WMI可以回答:P@AlexPilon-查看直接调用Windows API的更新PowerShell答案(无需解析
网络视图的输出)。