プロジェクト

全般

プロフィール

WebDav Access By PowerShell » 履歴 » バージョン 2

健二 酒井, 2019/07/22 12:56

1 1 健二 酒井
# WebDav Access By PowerShell
2 1 健二 酒井
3 1 健二 酒井
## 概要
4 1 健二 酒井
5 1 健二 酒井
タイトルの通り。PowerShellを使ってのWebDavへのアクセス。
6 1 健二 酒井
やること:PowerShellでWebDavディレクトリからのファイルダウンロード(ディレクトリへのファイルアップロード)
7 1 健二 酒井
 
8 1 健二 酒井
- 実際のコマンド
9 1 健二 酒井
- 前提
10 1 健二 酒井
- 解説
11 1 健二 酒井
12 1 健二 酒井
### 実際のコマンド
13 1 健二 酒井
14 1 健二 酒井
大体こんな感じ
15 1 健二 酒井
16 1 健二 酒井
ファイルを取得
17 1 健二 酒井
```
18 1 健二 酒井
$ cd ~\Desktop
19 1 健二 酒井
$ Get-Credential |sv cred
20 1 健二 酒井
$ Invoke-WebRequest -Method Get -Uri https://dav.example.com/hello.html -Credential $cred | sv response
21 1 健二 酒井
$ [System.Text.Encoding]::UTF8.GetBytes($response.Content) | Set-Content -Encoding Byte hello.html
22 1 健二 酒井
```
23 1 健二 酒井
24 1 健二 酒井
ファイルをアップ
25 1 健二 酒井
```
26 1 健二 酒井
$ cd ~\Desktop
27 1 健二 酒井
$ Get-Credential |sv cred
28 1 健二 酒井
$ Get-Content hello.html | sv $content 
29 1 健二 酒井
$ [System.Text.Encoding]::UTF8.GetBytes($content) | sv raw_content
30 1 健二 酒井
$ Invoke-WebRequest -Method Put -Uri https://dav.example.com/hello.html -Credential $cred -Body ([Byte[]]$raw_content)
31 1 健二 酒井
```
32 1 健二 酒井
33 1 健二 酒井
### 前提
34 1 健二 酒井
35 1 健二 酒井
- サーバ Apache
36 1 健二 酒井
- 対象URI  https://dav.example.com/hello.html
37 1 健二 酒井
   - エンコード BOM無しUTF8
38 1 健二 酒井
- 認証 Basic認証
39 1 健二 酒井
   - ユーザー:user
40 1 健二 酒井
   - パスワード:password
41 1 健二 酒井
- クライアント PowerShell 5
42 1 健二 酒井
- OS Windows 10
43 1 健二 酒井
44 1 健二 酒井
45 1 健二 酒井
### 解説
46 1 健二 酒井
47 1 健二 酒井
#### PowerShellの打ち方
48 1 健二 酒井
49 1 健二 酒井
svは変数を設定するコマンドレットSet-Valueの省略形。流れるような感じが好きなので代入じゃなくてSet-Valueを使っている
50 1 健二 酒井
最後にPutするときキャストしているのはsvの結果作られる変数$raw_contentは型がObject[]になる。
51 1 健二 酒井
これをBodyにすると数字の羅列が送られてしまい、バイト列として送られないのでキャストしている。
52 1 健二 酒井
53 1 健二 酒井
#### 認証
54 1 健二 酒井
55 1 健二 酒井
Get-Credentialで入力するのは当然ながら前提で書いたユーザーとパスワード
56 1 健二 酒井
WebDav側の認証はGet-Credenialで取得したのをそのままInvoke-WebRequestに渡してあげればうまくいく。すごい。
57 1 健二 酒井
Apache側で作成したコマンドは
58 2 健二 酒井
59 1 健二 酒井
```
60 1 健二 酒井
# htpasswd -c /etc/httpd/conf/htpasswd user
61 1 健二 酒井
```
62 2 健二 酒井
63 1 健二 酒井
とかそんな感じ。
64 1 健二 酒井
65 1 健二 酒井
#### エンコード
66 1 健二 酒井
67 1 健二 酒井
いつも悩ましいPowerShellの文字エンコード。ざっくりおさらい
68 1 健二 酒井
69 1 健二 酒井
- PowerShell 5は内部的には文字列型はエンコードがUTF16とかいう奴が使われているらしい。
70 1 健二 酒井
- PowerShell 5系まではUTF8を指定して書出するとBOM付きUTF8になる。読込はBOM無しUTMなくてもちゃんと読んでくれる。
71 1 健二 酒井
- PowerShell 6系(.Net Core環境のPowerShell)からはBOM無しらしい。
72 1 健二 酒井
73 1 健二 酒井
ここら辺うまく設定してあげないとエンコードがよくわからないエンコーディングがよくわからない何かがWebDav側に作られる。ここら辺いまいち使いにくい。
74 1 健二 酒井
(ちなみに「既存コマンド | コマンドレット」とか「コマンドレット | 既存コマンド」とかのパイプも文字コードを意識する必要があって面倒臭い)
75 1 健二 酒井
というわけで「もうByte列で扱えばいいよね」ってことに行き着く。
76 1 健二 酒井
77 1 健二 酒井
Byte列にしてるのが\[System.Text.Encoding\]のところ。発想は出てくるけどやり方は忘れがち。  
78 1 健二 酒井
以下のサイトを参考にしました。
79 1 健二 酒井
80 1 健二 酒井
参考 https://www.uramiraikan.net/Works/entry-2798.html
81 1 健二 酒井
82 1 健二 酒井
なんかこれ調べるためにぐぐってたらロシア語のタイトルとか見つけた。
83 1 健二 酒井
ロシア人もきっと文字エンコードで悩んでいるんだろうな。
84 1 健二 酒井
85 1 健二 酒井
### WebDav
86 1 健二 酒井
87 1 健二 酒井
素直にPutしてあげたらファイルの更新も作成もどっちもやってくれました。
88 1 健二 酒井
ステータスコードが更新だと「204 No Content」とか作成だと「201 Created」とかで帰ってくる。
89 1 健二 酒井
失敗時はよくわからないので体験したら追記するかもしれない。
90 1 健二 酒井
ディレクトリの作成もよくわからない。たぶん、MKCOLメソッドとかいう奴を使うんだろう。たぶん。
91 1 健二 酒井
削除はたぶんDELETEメソッドだろう。そこらへんWebDavというプロトコルの知識。
92 1 健二 酒井
93 1 健二 酒井
## 参考
94 1 健二 酒井
95 1 健二 酒井
"Invoke-RestMethod"とかの文字コード https://www.uramiraikan.net/Works/entry-2798.html