LoginSignup
1
1

More than 5 years have passed since last update.

PowerShellでiOSのProfileを大量生産

Last updated at Posted at 2018-12-15

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 氏から助け舟が、

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1