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

關閉iPhone照相功能, 透過 Jamf Pro 的 API 讓人員在打卡或進入到特定地理位置時,自動關閉 iPhone 或 iPad 上的相機。當然,也適用於 macOS 上的相機就是了。

分享

本文為 關閉照相功能, 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 台灣 的原廠協助你吧,或是留言在下面。

Read more

Managed Preferences 到底贏不贏得過本機設定?自己寫工具測給自己看

Managed Preferences 到底贏不贏得過本機設定?自己寫工具測給自己看

在管理一批用 MDM 集中控管的 Mac 時,常常會遇到一個問題:某個 preference key,使用者自己用 defaults write 改過一次,管理員可能又用 sudo defaults write 在系統層級動過一次,最後 MDM 又把同一個 key 標成 Managed(強制)。這時候系統實際生效的到底是哪一個值? Apple 官方文件對 CFPreferencesAppValueIsForced 這支 API 的說明相當簡略,只告訴你這個 API 可以拿來判斷某個 key 是不是被強制,卻沒有把整個 preference 搜尋順序裡各層級的先後關係講清楚。網路上能找到的資訊也大多是憑印象轉述,沒有人真的擺出證據。 與其對著文件猜,不如自己寫一支工具,實際測給自己看。以下這篇的測試環境是 macOS Tahoe 26.6.

By Glee Tsai
Apple 生態系的真實威脅—我們都可能是目標

Apple 生態系的真實威脅—我們都可能是目標

從一場分享開始的警醒 前陣子在 Jamf Nation Live Taipei 分享了 2024-2025 年 Apple 裝置威脅報告,深入探討了全球 Apple 生態系正面臨的資訊安全威脅。 許多人對 Apple 產品有一種根深蒂固的信心—拿著 Mac 或 iPhone,就像拿到了數位世界的「免死金牌」。說實話,Apple 在軟硬體整合上的安全設計確實領先業界,這不是誇大其詞。但也正因為這份信心,我開始想更深入地了解真實情況。 從 Jamf Security 360 報告開始,我觀察了全球情報機構(如 Citizen Lab、Google TAG、Kaspersky)揭露的真實案例。那時我才意識到一個有點殘酷的事實,也正好對應了同事最常對我說的那句話:Apple 設備並非堅不可摧,使用者自身往往才是最大的弱點。 為什麼 Apple

By Glee Tsai

從 Jamf Pro 自定義註冊畫面帶使用者資訊至 Jamf Connect 失敗的處理方式

Jamf Pro 在設定裡面的 Enrollment Customization,本來可以設定在使用者完成設備註冊的當下,同步把 SAML 裡的資訊帶給後面的 Jamf Connect Login,這樣就可以減少一步使用者還需要登入的步驟。但在撰文的當下,Jamf Pro 11.1 仍在這個功能上有問題,在跟 Jamf Support Team 了解後,大概能用一種 Workaround 來解決,只是要特別留意以下事情: 1. 在 Jamf Pro 裡的 Enrollment Customization 不要再打勾 Enable Jamf Pro to pass user information to Jamf Connect 了(因為勾了也沒有用) 2. 確保

By Glee Tsai

在 Apple 零接觸部署下僅允許某個群組啟動設備

在 Jamf Pro 有整合 Single Sign On 的情況下,可以前往 Settings > Enrollment Customization 設定僅允許一個群組中的成員啟用設備。如果這個成員沒有在這個群組裡面的話,就不能夠開箱設備。如果以 Entra ID 為例,需要把 Object ID 填在下方的欄位即可。 對照到我在 Entra ID 上的群組設置: 至於如果不是 Entra ID,而是其它的 SSO Provider 的話,最好可以用 SAML Tracer 這一套 Google Chrome 外掛去看一下自己的 SAML 文件是如何表達群組的,例如下圖能看到這個使用者屬於以下五個群組。 接著有另外一個很重要的事情要提醒,如果你要阻擋註冊的成員,可以登入到 Jamf Pro

By Glee Tsai