前言:
行動裝置普及,許多企業在搜尋管理行動裝置的解決方案
有許多供應商提供功能完整的解決方案,但價格不斐,
也參考過許多不錯的前輩寫的文獻與作法,像是一念之間,wso2..等
但最後在考量經濟與彈性及只需要簡單的鎖照相/截圖的功能結合門禁系統的應用,
因此最後選擇open source解決方案https://github.com/project-imas/mdm-server
本範例是架設 python mdm server 並嘗試用個人理解後用c#改寫後結合restful api 以控制iphone/ipad
但台灣這方面的文獻與實作太少,所以在架設成功之後寫這篇文章,期望能夠幫助遭遇同樣困境的IT人員
作業系統環境:ubuntu 14.2
pytyon 版本:2.7.9+
企業開發者帳號(這個一定要)
此範例的結果要做的效果如下
Device Lock 順序:
1.ADDED COMMAND TO QUEUE: a17ffc3b-1128-4d12-8682-61c129a09f44
*Adding CMD: a17ffc3b-1128-4d12-8682-61c129a09f44 to device: 9e1ce93d7d88d065fccc860d71e3938ab9d290df
STORING DEVICES...
payload:{"aps":{},"mdm":"B2B08E69-90EB-499F-A924-05CEE290BD9A"}
2.Received 306 bytes: Idle Status
*FETCHING CMD TO BE SENT FROM DEVICE: 9e1ce93d7d88d065fccc860d71e3938ab9d290df
**Sending command a17ffc3b-1128-4d12-8682-61c129a09f44 and moving it from queue**
Sent: DeviceLock
payload:{'Status': 'Idle', 'UDID': '
In:
<?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>Status</key>
<string>Idle</string>
<key>UDID</key>
<string>9e1ce93d7d88d065fccc860d71e3938ab9d290df</string>
</dict>
</plist>
Out:
<?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>Command</key>
<dict>
<key>RequestType</key>
<string>DeviceLock</string>
</dict>
<key>CommandUUID</key>
<string>d3e74f8c-b6b4-4cd8-97b0-dee61a7c4f55</string>
<key>TimeStamp</key>
<real>1492499347.64533</real>
</dict>
</plist>
3.Received 393 bytes: Acknowledged
*CALLING ADD RESPONSE TO CMD: a17ffc3b-1128-4d12-8682-61c129a09f44
**ADDING RESPONSE TO CMD: a17ffc3b-1128-4d12-8682-61c129a09f44
STORING DEVICES...
payload:{'Status': 'Acknowledged', 'CommandUUID': 'a17ffc3b-1128-4d12-8682-61c129a09f44', 'UDID': '
In:
<?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>CommandUUID</key>
<string>10d897e4-a655-4d18-9e17-00ccf9e34450</string>
<key>Status</key>
<string>Acknowledged</string>
<key>UDID</key>
<string>9e1ce93d7d88d065fccc860d71e3938ab9d290df</string>
</dict>
</plist>
Out:
<?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>
</dict>
</plist>
Install Profile順序
1.ADDED COMMAND TO QUEUE: b4bdfc89-32b0-47fe-8aed-c8c8020f873a
*Adding CMD: b4bdfc89-32b0-47fe-8aed-c8c8020f873a to device: 9e1ce93d7d88d065fccc860d71e3938ab9d290df
STORING DEVICES...
{"aps":{},"mdm":"241139DB-5A99-4CA8-84F3-AE90A750CC99"}
2.Received 306 bytes:Idle Status
*FETCHING CMD TO BE SENT FROM DEVICE: 9e1ce93d7d88d065fccc860d71e3938ab9d290df
**Sending command b4bdfc89-32b0-47fe-8aed-c8c8020f873a and moving it from queue**
Sent: InstallProfile
In:
<?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>Status</key>
<string>Idle</string>
<key>UDID</key>
<string>9e1ce93d7d88d065fccc860d71e3938ab9d290df</string>
</dict>
</plist>
Out:
<?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>Command</key>
<dict>
<key>Payload</key>
<data>
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NU
WVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VO
IiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4w
LmR0ZCI+CjxwbGlzdCB2ZXJzaW9uPSIxLjAiPgo8ZGljdD4KCTxrZXk+UGF5
bG9hZENvbnRlbnQ8L2tleT4KCTxhcnJheT4KCQk8ZGljdD4KCQkJPGtleT5Q
YXlsb2FkRGVzY3JpcHRpb248L2tleT4KCQkJPHN0cmluZz5Db25maWd1cmVz
IGRldmljZSByZXN0cmljdGlvbnMuPC9zdHJpbmc+CgkJCTxrZXk+UGF5bG9h
ZERpc3BsYXlOYW1lPC9rZXk+CgkJCTxzdHJpbmc+UmVzdHJpY3Rpb25zPC9z
dHJpbmc+CgkJCTxrZXk+UGF5bG9hZElkZW50aWZpZXI8L2tleT4KCQkJPHN0
cmluZz5jb20uaW50cmVwaWR1c2dyb3VwLmRqcy50ZXN0LnNpbXBsZS5yZXN0
cmljdGlvbnM8L3N0cmluZz4KCQkJPGtleT5QYXlsb2FkT3JnYW5pemF0aW9u
PC9rZXk+CgkJCTxzdHJpbmc+PC9zdHJpbmc+CgkJCTxrZXk+UGF5bG9hZFR5
cGU8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuYXBwbGljYXRpb25hY2Nl
c3M8L3N0cmluZz4KCQkJPGtleT5QYXlsb2FkVVVJRDwva2V5PgoJCQk8c3Ry
aW5nPjc3RDJGRkIxLUMwMTAtNDIyMC1BM0Q5LUJGRTRCM0VGOTlGRDwvc3Ry
aW5nPgoJCQk8a2V5PlBheWxvYWRWZXJzaW9uPC9rZXk+CgkJCTxpbnRlZ2Vy
PjE8L2ludGVnZXI+CgkJCTxrZXk+YWxsb3dBZGRpbmdHYW1lQ2VudGVyRnJp
ZW5kczwva2V5PgoJCQk8dHJ1ZS8+CgkJCTxrZXk+YWxsb3dBcHBJbnN0YWxs
YXRpb248L2tleT4KCQkJPHRydWUvPgoJCQk8a2V5PmFsbG93Q2FtZXJhPC9r
ZXk+CgkJCTxmYWxzZS8+CgkJCTxrZXk+YWxsb3dFeHBsaWNpdENvbnRlbnQ8
L2tleT4KCQkJPHRydWUvPgoJCQk8a2V5PmFsbG93R2xvYmFsQmFja2dyb3Vu
ZEZldGNoV2hlblJvYW1pbmc8L2tleT4KCQkJPHRydWUvPgoJCQk8a2V5PmFs
bG93SW5BcHBQdXJjaGFzZXM8L2tleT4KCQkJPHRydWUvPgoJCQk8a2V5PmFs
bG93TXVsdGlwbGF5ZXJHYW1pbmc8L2tleT4KCQkJPHRydWUvPgoJCQk8a2V5
PmFsbG93U2FmYXJpPC9rZXk+CgkJCTx0cnVlLz4KCQkJPGtleT5hbGxvd1Nj
cmVlblNob3Q8L2tleT4KCQkJPGZhbHNlLz4KCQkJPGtleT5hbGxvd1ZpZGVv
Q29uZmVyZW5jaW5nPC9rZXk+CgkJCTx0cnVlLz4KCQkJPGtleT5hbGxvd1Zv
aWNlRGlhbGluZzwva2V5PgoJCQk8dHJ1ZS8+CgkJCTxrZXk+YWxsb3dZb3VU
dWJlPC9rZXk+CgkJCTx0cnVlLz4KCQkJPGtleT5hbGxvd2lUdW5lczwva2V5
PgoJCQk8dHJ1ZS8+CgkJCTxrZXk+Zm9yY2VFbmNyeXB0ZWRCYWNrdXA8L2tl
eT4KCQkJPGZhbHNlLz4KCQkJPGtleT5yYXRpbmdBcHBzPC9rZXk+CgkJCTxp
bnRlZ2VyPjEwMDA8L2ludGVnZXI+CgkJCTxrZXk+cmF0aW5nTW92aWVzPC9r
ZXk+CgkJCTxpbnRlZ2VyPjEwMDA8L2ludGVnZXI+CgkJCTxrZXk+cmF0aW5n
UmVnaW9uPC9rZXk+CgkJCTxzdHJpbmc+dXM8L3N0cmluZz4KCQkJPGtleT5y
YXRpbmdUVlNob3dzPC9rZXk+CgkJCTxpbnRlZ2VyPjEwMDA8L2ludGVnZXI+
CgkJPC9kaWN0PgoJPC9hcnJheT4KCTxrZXk+UGF5bG9hZERlc2NyaXB0aW9u
PC9rZXk+Cgk8c3RyaW5nPlZlcnkgc2ltcGxlIHByb2ZpbGUgdG8gdGVzdCBy
ZXN0cmljdGlvbnMuPC9zdHJpbmc+Cgk8a2V5PlBheWxvYWREaXNwbGF5TmFt
ZTwva2V5PgoJPHN0cmluZz5WZXJ5IFNpbXBsZSBSZXN0cmljdGlvbiBUZXN0
PC9zdHJpbmc+Cgk8a2V5PlBheWxvYWRJZGVudGlmaWVyPC9rZXk+Cgk8c3Ry
aW5nPmNvbS5pbnRyZXBpZHVzZ3JvdXAuZGpzLnRlc3Quc2ltcGxlPC9zdHJp
bmc+Cgk8a2V5PlBheWxvYWRPcmdhbml6YXRpb248L2tleT4KCTxzdHJpbmc+
PC9zdHJpbmc+Cgk8a2V5PlBheWxvYWRSZW1vdmFsRGlzYWxsb3dlZDwva2V5
PgoJPGZhbHNlLz4KCTxrZXk+UGF5bG9hZFR5cGU8L2tleT4KCTxzdHJpbmc+
Q29uZmlndXJhdGlvbjwvc3RyaW5nPgoJPGtleT5QYXlsb2FkVVVJRDwva2V5
PgoJPHN0cmluZz4yRDk0OTBGNC1FODkwLTRCMzctOTA2Mi03MDk1RkVGMEU0
ODI8L3N0cmluZz4KCTxrZXk+UGF5bG9hZFZlcnNpb248L2tleT4KCTxpbnRl
Z2VyPjE8L2ludGVnZXI+CjwvZGljdD4KPC9wbGlzdD4K
</data>
<key>RequestType</key>
<string>InstallProfile</string>
</dict>
<key>CommandUUID</key>
<string>b4bdfc89-32b0-47fe-8aed-c8c8020f873a</string>
<key>TimeStamp</key>
<real>1492502394.890576</real>
</dict>
</plist>
3.Received 393 bytes: Acknowledged
*CALLING ADD RESPONSE TO CMD: b4bdfc89-32b0-47fe-8aed-c8c8020f873a
**ADDING RESPONSE TO CMD: b4bdfc89-32b0-47fe-8aed-c8c8020f873a
STORING DEVICES...
In:
<?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>CommandUUID</key>
<string>b4bdfc89-32b0-47fe-8aed-c8c8020f873a</string>
<key>Status</key>
<string>Acknowledged</string>
<key>UDID</key>
<string>9e1ce93d7d88d065fccc860d71e3938ab9d290df</string>
</dict>
</plist>
Out:
<?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>
</dict>
</plist>
Remove Profile
1.ADDED COMMAND TO QUEUE: 2313099b-73ee-44bc-8478-ce7ca2786a7c
*Adding CMD: 2313099b-73ee-44bc-8478-ce7ca2786a7c to device: 9e1ce93d7d88d065fccc860d71e3938ab9d290df
STORING DEVICES...
{"aps":{},"mdm":"241139DB-5A99-4CA8-84F3-AE90A750CC99"}
2.Received 306 bytes: Idle Status
*FETCHING CMD TO BE SENT FROM DEVICE: 9e1ce93d7d88d065fccc860d71e3938ab9d290df
**Sending command 2313099b-73ee-44bc-8478-ce7ca2786a7c and moving it from queue**
Sent: RemoveProfile
In:
<?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>Status</key>
<string>Idle</string>
<key>UDID</key>
<string>9e1ce93d7d88d065fccc860d71e3938ab9d290df</string>
</dict>
</plist
Out:
<?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>Command</key>
<dict>
<key>Identifier</key>
<string>com.intrepidusgroup.djs.test.simple</string>
<key>RequestType</key>
<string>RemoveProfile</string>
</dict>
<key>CommandUUID</key>
<string>2313099b-73ee-44bc-8478-ce7ca2786a7c</string>
<key>TimeStamp</key>
<real>1492505053.965881</real>
</dict>
</plist>
3.Received 393 bytes: Acknowledged
*CALLING ADD RESPONSE TO CMD: 2313099b-73ee-44bc-8478-ce7ca2786a7c
**ADDING RESPONSE TO CMD: 2313099b-73ee-44bc-8478-ce7ca2786a7c
STORING DEVICES...
In:
<?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>CommandUUID</key>
<string>2313099b-73ee-44bc-8478-ce7ca2786a7c</string>
<key>Status</key>
<string>Acknowledged</string>
<key>UDID</key>
<string>9e1ce93d7d88d065fccc860d71e3938ab9d290df</string>
</dict>
</plist>
Out:
<?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>
</dict>
</plist>