關閉iPhone照相功能, 使用 Jamf API 自動停用鏡頭

Published by gleetsai on

本文為 關閉照相功能, Jamf 幫助軍隊與科技業自動停用相機 的接續篇,會更實際的談談如何用 Jamf Pro API 自動 關閉iPhone照相功能。

在上一篇文章裡已經說明了實作理論,透過 Jamf Pro 的 API 讓人員在打卡或進入到特定地理位置時,自動關閉 iPhone 或 iPad 上的相機。當然,也適用於 macOS 上的相機就是了。

這個系列有兩篇,主要是講如何滿足自動關閉相機的需求,主要會用 Jamf Pro API 及 Swift 語法完成相關內容。

這一篇會著墨在程式碼的實作部分,因為 Jamf Pro 有 Smart Group 功能的關係,只要符合條件,就會自動掉入到相對應的智慧群組,強制關閉相機的設定就會自動打到這個群組裡的所有設備裡。當設備不符合條件時,就會自動被移出這個智慧型群組,也就自動 關閉iPhone照相功能 。

因為 Jamf Pro 有提供 Restful API 可供串接的好處,上文的功能建議實作在伺服器上。或是像這篇文章一樣,假設員工是用 iPad 進行打卡上班(無論形式是輸入工號、人臉辨識或是感應員工卡等),我們也可以把這個功能實作在 iPad 上。

參考上一篇文章,在 Jamf Pro 開立好延伸式屬性(Extension Attribute)後,我們可以利用 Jamf Pro 的 API 更新這項屬性就好。例如我在 Jamf Pro 上面開了一個延伸式屬性叫做 ShouldLockCamera ,接下來只要透過 Jamf Pro API 把這個屬性的內容從 false 改為 true 就能鎖相機。

從員工工號到找到設備

參考 Jamf Pro API 文件,可以找到跟使用者有關的 Jamf Pro API 為:

GET /users/name/{name}

不過需要先通過認證才能呼叫這個 API,Jamf Pro 接受 Basic Authentication 或 JWT 的方式呼叫。如果是 Basic Authentication 的話,要把帳號密碼組合成 的形式,並且將其使用 base64 雜湊過後使用。

假設帳號是 admin,密碼是 123456,就是要組合成 admin:123456 這樣的字串,並且用 base64 雜湊一下。在 macOS 裡面的終端機可以打以下指令,找到 base64 過後的值:

printf "admin:123456" | iconv -t ISO-8859-1 | base64 -i -

結合以上資訊,當要找到 glee 有哪些裝置在公司裡登記在案的話,就可以用這個 API 來找:

curl "https://你的 Jamf 網址/JSSResource/users/name/glee" \
     -H 'Accept: application/json' \
     -u '帳號:密碼'

因為是要寫在 iPad 上的打卡系統,所以用 Swift 寫的話,Request 大概會長這樣:

let urlString = "\(Jamf網址)/users/name/glee"
let url = URL(string: urlString)
var request = URLRequest(url: url!)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue("Basic \(base64過後的帳密)", forHTTPHeaderField: "Authorization")

這個使用者的裝置可能會有多台,會在 mobile_devices這個物件下被找到,底下是回傳的 JSON 型式,由此可知 Glee Tsai 有一台設備,在 Jamf Pro 裡面的管理 ID 是 2 號:

{
  "user": {
    "id": 1,
    "name": "glee",
    "full_name": "Glee Tsai",
    "email": "",
    "email_address": "",
    "phone_number": "",
    "position": "",
    "managed_apple_id": "",
    "enable_custom_photo_url": false,
    "custom_photo_url": "",
    "ldap_server": {
      "id": -1,
      "name": "None"
    },
    "extension_attributes": [],
    "sites": [],
    "links": {
      "computers": [],
      "peripherals": [],
      "mobile_devices": [
        {
          "id": 2,
          "name": "Glee's iPad"
        }
      ],
      "vpp_assignments": [],
      "total_vpp_code_count": 0
    },
    "user_groups": {
      "size": 0
    }
  }
}

更新裝置上的延伸式屬性資訊

既然知道這個裝置的管理編號是 2 號了,接下來使用 Jamf 的更新資訊 API 來把 shouldLockCamera 這個屬性改成 true。

PUT /mobiledevices/id/{id}

因為 Jamf Pro Classic API 僅接受用 XML 更新資料,如果用 Swift 寫 Request 的話大概會長這樣:

let urlString = "\(apiEndpoint)/mobiledevices/id/\(裝置管理編號)"
let url = URL(string: urlString)
var request = URLRequest(url: url!)
request.httpMethod = "PUT"
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue("Basic \(base64後的帳密)", forHTTPHeaderField: "Authorization")
let bodyString = "<mobile_device><extension_attributes><extension_attribute><id>\(裝置管理編號)</id><name>延伸式屬性名稱</name><type>String</type> <multi_value>\(true或false二擇一)</multi_value><value>\(true或false二擇一)</value></extension_attribute></extension_attributes></mobile_device>"
request.httpBody = bodyString.data(using: .utf8, allowLossyConversion: true)

更新裝置上的延伸式屬性資訊

最後一步,回到 Jamf Pro 上新增一個 Configuration Profile 的 Restrictions,把相機關閉選項打勾,並且 Scope 到 shouldLockCamera 為 true 的智慧型群組。這樣就完成了。

範例程式碼可由此下載

https://github.com/gds21/LockCameraUsingJamfPro

下一步往哪裡走?

上面的文章可以幫助你自動 關閉iPhone照相功能 ,如果你看得到內文的程式碼,但其它地方都看不懂,有可能是你手上沒有 Jamf 的帳號、或是對 Jamf 的智慧型群組不太熟,請找到 Jamf 台灣 的原廠協助你吧,或是留言在下面。


1 Comment

關閉照相功能, Jamf 幫助軍隊與科技業自動停用相機 - 不在蘋果飛碟裡的傳教士 · 2020-09-13 at 13:39

[…] 第二篇:關閉iPhone照相功能, 使用 Jamf API 自動停用鏡頭 […]

Comments are closed.