PowerShellでiOSのProfileを大量生産

KDDI Mobile Saftey ManagerというMDMを使って社内のiPadを管理しています。
VPNやメールの設定等のプロファイルが遠隔から設定できます。

とっても便利。

以前、Profileを使って62台のiPadにVPNの設定を流し込みました。

L2TPからIPSecにVPNの設定を変更することになりました。
ユーザー名とパスワードは同じ。
L2TPで設定されたProfile,62個からユーザー名とパスワードをcsvの一覧にできないだろうか？

csvの一覧からVPNの設定プロファイルを62個一気に作ることはできるだろうか？

#iOSプロファイルからユーザ名とパスワードを抜き出す

PowerShellのXMLパースで取れないかと画策したけど、
多分無理だわ。

```xml:iOSprofile
<key>EmailAddress</key>
<string>a@a.com</string>
```

みたいな構文になっているので、
Keyしか取れない(´;ω;｀)

そこへ　@todashuta 氏から助け舟が、

https://gist.github.com/todashuta/a888ed902448d0d856f70f6ab4c63dbe

```posh:todashuta氏が示したSource
$xmlstr = @"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>UDID</key>
        <string></string>
        <key>VERSION</key>
        <string>7A182</string>
        <key>MAC_ADDRESS_EN0</key>
        <string>00:00:00:00:00:00</string>
        <key>CHALLENGE</key>
        <string>String</string>
    </dict>
</plist>
"@

$xmlobj = [xml]$xmlstr
$el = $xmlobj.plist.dict.SelectNodes("*")
$table = @{}
for ($i=0; $i -lt $el.Count; $i=$i+2) {
	$table[$el[$i].innerText] = $el[$i+1].innerText
}

```

おお、これなら引っこ抜ける。

さらにこれを複数のプロファイルのデータを引っこ抜けるように拡張します。

```posh:複数のProfileからデータを取り出す
$file=(ls *.mobileconfig).Name

function mydata(
[Parameter(ValueFromPipeline=$true)] $param){
    begin{
        $hash=@{}
        $data
        $list=@()
    }
    process{
        #echo $param
        $xmlobj=[xml](get-content -raw $param -Encoding UTF8)
        $el=$xmlobj.plist.dict.array.dict.dict.SelectNodes('*')
        
        for ($i=0; $i -lt $el.Count; $i=$i+2) {
	        $hash[$el[$i].innerText] = $el[$i+1].innerText
        }
        $data=[PSCustomObject]$hash
        $data=$data | Select-Object SharedSecret,AuthName,AuthPassword
        $list+=$data
    }
    end{
        $list
    }
}

$vpnlist=$file | mydata
$vpnlist | Export-Csv vpnlist.csv -Encoding utf8 -NoTypeInformation

```

これでcsvの一覧ができました。

下記が作ったSample Code
[profile2csv - GitHub](https://github.com/arachan/profile2csv)

#Templateとcsv一覧からiOSプロファイルを作成

上のソースでVPNのユーザー名とパスワードの一覧を抜き出せた。

PowerShellに -replace という命令がある。
これを使えばtemplateっぽいことができるのでは？

vpn接続するprofileをもとにvpn.templateを作った。
下記のようになっている。

```xml:vpn.template(一部抜粋)

<key>RemoteAddress</key>
<string>rc.umiyama.co.jp</string>
<key>SharedSecret</key>
<string>Sazaesan</string>
<key>XAuthEnabled</key>
<integer>1</integer>
<key>XAuthName</key>
<string>{AuthName}</string>
<key>XAuthPassword</key>
<string>{AuthPassword}</string>

```

{AuthName}と{AuthPassword}にユーザー名とパスワードをreplaceで挿入。
そのAuhtNameのmobileconfigを作っていく。
というようなスクリプトを書けばいい。

それが下記のCode

```posh:iOS_Profile大量生産 
# load data
$data=Import-Csv -Path .\vpnlist.csv -Encoding UTF8

foreach($d in $data){
    # load template
    $temp=Get-Content .\vpn.template -Encoding UTF8

    # merge template
    $temp=$temp -replace '{AuthName}',$d.AuthName
    $temp=$temp -replace '{AuthPassword}',$d.AuthPassword

    $file=$d.AuthName+'.mobileconfig'

    # output newfile
    $temp | out-file -FilePath $file -Encoding utf8
}

```

このconfigファイルを読み込んでいけば設定完了だ。

下記が作ったSample Code
[csv2profile - GitHub](https://github.com/arachan/csv2profile)