free mdm server架設心得(一)

  • 1499
  • 0
  • 2018-05-09

前言:

   行動裝置普及,許多企業在搜尋管理行動裝置的解決方案

有許多供應商提供功能完整的解決方案,但價格不斐,

也參考過許多不錯的前輩寫的文獻與作法,像是一念之間,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+

企業開發者帳號(這個一定要)

此範例的結果要做的效果如下

https://youtu.be/70RMR_CNRtc

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': '9e1ce93d7d88d065fccc860d71e3938ab9d290df'}

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': '9e1ce93d7d88d065fccc860d71e3938ab9d290df'}

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>