PSFTP – ListDirectoryDetails

Bazowo PowerShell pozwala na dostęp do wielu różnych typów „napędów”, m.in. lokalne czy sieciowe dyski, ale również takie lokalizacje jak rejestry lub certyfikaty. Niestety nie ma dość przydatnej lokalizacji jaką jest FTP. Nie mniej można sobie z tym poradzić w inny sposób, a mianowicie z wykorzystaniem obiektu klasy .NET – FtpWebRequest.

Na początek spróbujmy podłączyć się do serwera FTP i wylistować elementy konta FTP z danej ścieżki. Do tego celu tworzymy obiekt klasy FtpWebRequest z podaniem parametru, którym jest ścieżka do lokalizacji na serwerze ftp.

$RequestUri = "ftp://myserverftp.pl/myfolder"
[System.Net.FtpWebRequest]$Request = [System.Net.WebRequest]::Create($RequestUri)

Gdy posiadamy już obiekt naszego zapytania do serwera FTP musimy podać kilka dodatkowych parametrów odpowiadających m.in za uwierzytelnienie konta czy sposób połączenia się z nim.

$Request.Credentials = Get-Credential
$Request.EnableSsl = $true
$Request.KeepAlive = $true
$Request.UseBinary = $true
$Request.UsePassive = $true

Ostatecznie podajemy metodę jaką chcemy wykonać podczas wysyłania zapytania do serwera ftp. Wykaz dostępnych metod znajdziemy w MSDN Library w opisie klasy WebRequestMethods.Ftp.

$Request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectoryDetails

PS. W przypadku gdy posiadamy jakiś problem z certyfikatem dla połączenia ssl możemy go zignorować poprzez wyłączenie walidacji certyfikatu.

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

Gdy posiadamy już poprawnie ustawione zapytanie możemy je wysłać do serwera.

$Response = $Request.GetResponse()

I odebrać odpowiedź zwrotną poprzez obiekt wejścia/wyjścia StreamReader.

[System.IO.StreamReader]$Stream = $Response.GetResponseStream()

Dane są przesyłąne w formie tekstowej, niemniej jednak sam ukłąd danych jest na tyle uporządkowany, iż możemy go podzielić przy użyciu Regex na odpowiednie bloki, a następnie przypisać do poszczególnych właściwości naszego obiektu PowerShella.

$ListDirectoryDetails = @()
[string]$Line = $Stream.ReadLine()
While ($Line)
{
  $null, [string]$isDirectory, [string]$flag, [string]$link, [string]$userName, [string]$groupName, [string]$size, [string]$date, [string]$name = `
  [regex]::split($Line,'^([d-])([rwxt-]{9})\s+(\d{1,})\s+([A-Za-z0-9-]+)\s+([A-Za-z0-9-]+)\s+(\d{1,})\s+(\w+\s+\d{1,2}\s+\d{1,2}:?\d{2})\s+(.+?)\s?$',"SingleLine,IgnoreCase,IgnorePatternWhitespace")

  $LineObj = New-Object PSObject -Property @{
    Dir = $isDirectory
    Right = $flag
    Ln = $link
    User = $userName
    Group = $groupName
    Size = $size
    ModifiedDate = $date
    Name = $name
  }

  $ListDirectoryDetails += $LineObj
}

Źródła:
http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx
http://msdn.microsoft.com/en-us/library/system.net.webrequestmethods.ftp.aspx
http://gallery.technet.microsoft.com/scriptcenter/PowerShell-FTP-Client-db6fe0cb

Advertisements

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s