Help us understand the problem. What is going on with this article?

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パースで取れないかと画策したけど、
多分無理だわ。

iOSprofile
<key>EmailAddress</key>
<string>a@a.com</string>

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

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

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

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
}

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

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

複数の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

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

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

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

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

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

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away