檢視次數:
搜尋是一個強大的工具,在自動化任務時經常很有用。API 中的每個端點都提供搜尋資源的操作。例如,您可以使用 搜尋電腦 操作在 /api/computers 端點中搜尋電腦。
要使用搜尋操作,您需要提供一個包含一個或多個搜尋條件的搜尋篩選器物件。搜尋條件物件包括配置以下類型搜尋的屬性:
  • Boolean: 搜尋布林值。
  • Choice: 搜尋欄位具有一組定義的有效值
  • ID: 搜尋唯一 ID
  • Null: 搜尋空值
  • Numeric: 搜尋數值
  • String: 搜尋字串值
  • Date range: 搜尋日期值
使用多個條件的搜尋會返回滿足所有條件的結果。
秘訣
秘訣
資源屬性值的注意事項中所述,當您直接使用 API 時,使用 0 來表示空值。然而,要搜尋空值時,您需要使用 Null 搜尋。您不會執行數值搜尋 0。
搜尋條件包括以下項目:
  • 您正在搜尋的欄位名稱(資源的屬性)-- 請注意欄位名稱區分大小寫
  • 要搜尋的值(或對於日期值,則為日期範圍)
  • 運算子用於測試欄位值(不適用於日期值搜尋)
  • 返回項目的最大數量(預設為 5000)
秘訣
秘訣
在執行 ID 搜尋時,您不需要包含欄位名稱,因為預設為 ID 欄位。
您正在搜尋的值類型決定了可用的運算子。
類型
操作員
布林值
true (default) false
選擇(適用於具有定義的有效值集合的欄位)
等於(預設)不等於
日期
與日期相關的搜尋使用日期範圍,您不需要明確使用運算符。
ID(用於唯一 ID)
等於 (預設) 大於 大於或等於 小於 小於或等於 不等於
true(預設;true 表示 null) false
數字
等於 (預設) 大於 大於或等於 小於 小於或等於 不等於
字串
等於 不等於
以下範例對政策名稱進行簡單搜尋。
# Set search criteria
search_criteria = api.SearchCriteria()
search_criteria.field_name = "name"
search_criteria.string_test = "equal"
search_criteria.string_value = name

# Create a search filter
search_filter = api.SearchFilter(None, [search_criteria])
search_filter.max_items = 1

# Perform the search
policies_api = api.PoliciesApi(api.ApiClient(configuration))
policies_api.search_policies(api_version, search_filter=search_filter)
以下範例顯示如何建立包含多個條件的搜尋篩選器。
# Set search criteria for platform
policy_criteria = api.SearchCriteria()
policy_criteria.field_name = "policyID"
policy_criteria.numeric_test = "equal"
policy_criteria.numeric_value = policy_id

# Set search criteria for relay
relay_criteria = api.SearchCriteria()
relay_criteria.field_name = "relayListID"
relay_criteria.numeric_test = "equal"
relay_criteria.numeric_value = relay_list_id

# Create the search filter
search_filter = api.SearchFilter(None, [policy_criteria, relay_criteria])
如需有關驗證 API 呼叫的資訊,請參閱 使用 Server & Workload Security保護 驗證

可搜尋欄位

API 參考指出資源的哪些欄位是可搜尋的。您可以在操作的回應物件中找到這些欄位的資訊。
  1. 點選返回您正在搜尋的資源類型的操作。例如,描述電腦 操作返回電腦防護資源。
  2. 點選200 successful operation在回應部分。
  3. 閱讀欄位的描述。可搜尋欄位的描述包含「可搜尋為資料類型」,其中資料類型可以是字串、數值、ID、日期、布林值和選擇。
欄位名稱區分大小寫。
以下欄位無法搜尋:
  • 任何物件的 locale 欄位
  • 大多數具有物件作為值的欄位,例如 Policy 物件的 policySettings 欄位(例外情況請參見下文的“搜尋電腦防護子物件”)。
當您搜尋一個不可搜尋的欄位時,您會收到類似 Invalid SearchFilter: unknown fieldName: platform 的錯誤。

搜尋電腦防護子物件

雖然具有物件作為值的欄位通常不可搜尋,但在電腦防護類別中有幾個例外。例如,ec2VirtualMachineSummary 欄位的值是一個物件,該物件的幾個欄位是可搜尋的,例如 accountIDavailabilityZone。同樣地,您可以搜尋電腦 interfacesname 欄位。(請參閱 描述電腦 操作的回應架構,位於 API 參考 中,以了解更多可搜尋的子物件。)以下 JSON 顯示了這些在電腦防護物件資料結構中的子物件:
{
    "hostName": "gui2-336",
    "displayName": "",
    "description": "",
    ...
    "interfaces": {
      "name": "ethernet",
      ...
    },
    "ec2VirtualMachineSummary": {
      "accountID": "123456789012",
      "availabilityZone": "ap-northeast-1",
      ...
    },
    ...
    "ID": 201
}
在搜尋條件中,子物件的欄位名稱表示為路徑,例如 ec2VirtualMachineSummary/publicIPAddressinterfaces/name
秘訣
秘訣
在搜尋時使用 expand 參數,以僅包含您在返回的電腦防護物件中所需的資訊。欲了解詳細資訊,請參閱 效能提示 指南中的「最小化電腦防護回應大小」。
當您在電腦防護子對象上進行搜索時,該子對象會自動包含在返回的電腦防護對象中,除非expand設置為none(不返回任何子對象)。例如,如果您搜索 EC2 帳號 ID 並且expand設置為tasks,則返回的電腦防護對象包括tasksec2VirtualMachineSummary屬性。如果expand設置為ec2VirtualMachineSummary,則返回的電腦防護對象包括ec2VirtualMachineSummary屬性。
# Search criteria
computer_criteria = api.SearchCriteria()
computer_criteria.field_name = "ec2VirtualMachineSummary/accountID"
computer_criteria.string_test = "equal"
computer_criteria.string_value = account_id

# Search filter
max_items = None
search_filter = api.SearchFilter(max_items, computer_criteria)

# Include only the EC2 virtual machine summary in the returned computers
expand = api.Expand(api.Expand.ec2_virtual_machine_summary)

# Perform the search
computers_api = api.ComputersApi(api.ApiClient(configuration))

return computers_api.search_computers(api_version, search_filter=search_filter, expand=expand.list(), overrides=False)

Python 代碼中的欄位名稱

在使用 Python 用戶端程式庫時,請確保在搜尋中使用正確的欄位名稱。一些欄位名稱由多個連接的單詞組成,並使用駝峰式大小寫字母,例如入侵防護規則的 lastUpdated 屬性。相應的 Python 屬性使用底線字符 (_) 來分隔連接的單詞,而不是駝峰式大小寫字母,例如 last_updated。當您在某個欄位上進行搜尋時,必須提供您正在搜尋的欄位名稱 (lastUpdated),而不是類屬性 (last_updated)。
當您使用不正確的欄位名稱時,您會收到一個錯誤訊息 Invalid SearchFilter: unknown fieldName
當屬性名稱包含一個或多個底線字元 (_) 時,請使用以下算法將 Python 類屬性轉換為欄位名稱:
  1. 將每個底線後面的字母大寫。
  2. 刪除每個底線。

在字串搜尋中使用萬用字元

字串搜尋支援在字串值中使用兩個萬用字元:
  • %:匹配零個或多個字元
  • _; 匹配 1 個字元
例如,字串值 %Security 符合 Server & Workload Security保護,也符合 Security。字串值 version_ 符合 version1,但不符合 version。如果您想搜尋字面上的 %_ 字元,您可以關閉萬用字元。然而,萬用字元預設是已啟動的。以下的搜尋篩選器可用於尋找名為 "Base Policy" 的政策。
# Create the search criteria
search_criteria = api.SearchCriteria()
search_criteria.field_name = "name"
search_criteria.string_test = "equal"
search_criteria.string_value = "Base%"
秘訣
秘訣
若要關閉萬用字元搜尋,請將 `SearchCriteria` 物件的 `stringWildcards` 屬性設置為 `false`。
search_criteria.string_wildcards = "false"

執行日期範圍搜尋

您可以搜尋包含日期值的欄位,這些日期值落在兩個指定日期之間。以下搜尋條件欄位定義了日期範圍:
  • FirstDate: 範圍內的較早日期。預設值是最早的可能日期。
  • FirstDateInclusive: 一個布林值,指示範圍是否包含 FirstDate(true)或不包含(false)。預設值為 false。
  • LastDate: 範圍內的較晚日期。預設值為最晚的可能日期。
  • LastDateInclusive: 一個布林值,指示範圍是否包含 LasteDate(true)或不包含(false)。預設值為 false。
FirstDateLastDate 的值表示自 1970 年一月 1 日 (GMT) 起的毫秒數。
以下範例根據入侵防護規則的最後更新時間進行搜尋。
# Time that rules were last updated
current_time_in_ms = int(round(time.time() * 1000))
last_updated_in_ms = current_time_in_ms - (num_days * 24 * 60 * 60 * 1000)

# Set search criteria for the date range
search_criteria = api.SearchCriteria()
search_criteria.field_name = "lastUpdated"
search_criteria.first_date_value = last_updated_in_ms
search_criteria.last_date_value = current_time_in_ms
search_criteria.first_date_inclusive = True
search_criteria.last_date_inclusive = True

# Create a search filter
search_filter = api.SearchFilter(None, [search_criteria])

# Perform the search
intrusion_prevention_rules_api = api.IntrusionPreventionRulesApi(api.ApiClient(configuration))
return intrusion_prevention_rules_api.search_intrusion_prevention_rules(api_version, search_filter=search_filter)
另請參閱 API 參考中的 搜尋入侵防護規則 操作。有關 API 認證呼叫的資訊,請參閱 使用 Server & Workload Security保護 認證

搜尋空值

使用空測試搜尋來根據欄位是否沒有值(null)或有任何值來查找資源。例如,電腦的 lastSendPolicySuccess 欄位表示電腦最後一次成功更新策略的時間。要查找從未接收過策略更新的電腦,您可以對該欄位執行空測試搜尋。
對於此類搜尋,搜尋條件包括要搜尋的欄位名稱,以及您是否想要找到沒有值的資源(null_test = true)或任何值的資源(null_test = false)。
以下範例會搜尋從未接收過策略更新的電腦:
# Search criteria
computer_criteria = api.SearchCriteria()
computer_criteria.field_name = "lastSendPolicySuccess"
computer_criteria.null_test = True

# Search filter
max_items = None
search_filter = api.SearchFilter(max_items, computer_criteria)

# Include minimal information in the returned computers
expand = api.Expand(api.Expand.none)

# Perform the search
computers_api = api.ComputersApi(api.ApiClient(configuration))

return computers_api.search_computers(api_version, search_filter=search_filter, expand=expand.list(), overrides=False)
如需詳細資訊,請參閱 API 參考中的 搜尋電腦 操作。

排序順序

搜尋條件的特性決定搜尋結果的排序順序:
  • Boolean, Choice, Null, and String searches: 按返回對象的 ID 以升序排序。
  • ID searches: 按 ID 排序。操作員決定順序是升序還是降序:
    • 小於和小於或等於:降序
    • 所有其他運算子:遞增
  • Numeric searches: 按照搜尋的欄位排序。運算子決定順序是升序還是降序:
    • 小於和小於或等於:降序
    • 所有其他運算子:遞增
    當多個搜尋結果在搜尋欄位中具有相同的值時,這些對象將按 ID 進行次要排序。
  • Date searches: 按照搜尋的欄位排序。搜尋提供的日期範圍參數決定排序順序:
    • 僅提供 LastDate:降序
    • 任何其他組合:升序
    當多個搜尋結果在搜尋日期欄位具有相同的值時,這些對象將按 ID 進行次要排序。
  • Multiple search criteria: 使用多個搜尋條件的搜尋結果會按 ID(升序)排序,而不考慮各個條件的預設排序順序。
SearchFilter 物件使您能夠覆蓋預設的排序順序,並按返回物件的 ID 進行排序。

限制搜尋結果和分頁

使用搜尋篩選器的 maxItems 欄位來限制返回物件的數量。預設情況下,返回物件的最大數量為 5000,且不能超過 5000。
您也可以使用 maxItems 欄位來實現 ID 搜索結果的分頁:
  • 使用大於運算符號依 ID 搜尋
  • 使用 maxItems 來設定頁面大小
  • 根據上一頁結果中的最高 ID 計算要搜尋的 ID 值。
以下範例顯示如何使用搜尋來檢索一系列頁面中的所有電腦。
# Set search criteria
search_criteria = api.SearchCriteria()
search_criteria.id_value = 0
search_criteria.id_test = "greater-than"

# Create a search filter with maximum returned items
page_size = 10
search_filter = api.SearchFilter()
search_filter.max_items = page_size
search_filter.search_criteria = [search_criteria]

# Include the minimum information in the returned Computer objects
expand = api.Expand(api.Expand.none)

# Perform the search and do work on the results
computers_api = api.ComputersApi(api.ApiClient(configuration))
paged_computers = []


while True:
    computers = computers_api.search_computers(api_version, search_filter=search_filter, expand=expand.list(), overrides=False)
    num_found = len(computers.computers)
    current_paged_computers = []
    if num_found == 0:
        print("No computers found.")
        break

    for computer in computers.computers:
        current_paged_computers.append(computer)

    paged_computers.append(current_paged_computers)

    # Get the ID of the last computer in the page and return it with the number of computers on the page
    last_id = computers.computers[-1].id
    search_criteria.id_value = last_id
    print("Last ID: " + str(last_id), "Computers found: " + str(num_found))

return paged_computers
另請參閱 API 參考中的 搜尋電腦 操作。有關 API 調用身份驗證的信息,請參閱 使用 Server & Workload Security保護 進行身份驗證