ThreatLocker Approval Requests
Approval requests are how ThreatLocker users ask for an application
that's currently being blocked to be permitted. Each request carries
rich context — file path, hash, signer, the user who asked, the
computer it ran on, and a free-text justification. Triaging this queue
well is the difference between a productive ThreatLocker deployment
and a frustrated client.
Anti-triggers
- A malware detection. ThreatLocker is default-deny allowlisting, not
EDR — it blocks everything unlisted and has no verdict on whether a
binary is malicious. A request in this queue means "policy said no",
not "something was detected". Convictions and confirmed threats are
sentinelone-alerts or huntress-incidents.
- What the binary actually did on the endpoint. The request record
carries only the metadata the user submitted; execution history,
process chain, and prior blocks are
threatlocker-audit-log.
- Which endpoints an approval would cover. Permits land at group
scope, so the blast radius question is
threatlocker-computer-groups.
API Tools
List Approval Requests
threatlocker_approvals_list
POST-based GetByParameters — see api-patterns. Useful filters via
searchText: file name, application name, requester user, computer
name. Each request typically includes:
requestId, applicationName, fileName, filePath, fileHash
signer (Authenticode publisher), signerVerified boolean
requesterUser, computerName, computerId, organizationName
justification (free-text from the user), dateRequested
status — Pending, Approved, or Denied
Get Approval Request
threatlocker_approvals_get
Full detail for one request — includes additional context like the
specific policy that blocked it and any prior history of the same hash.
Pending Count
threatlocker_approvals_pending_count
Cheap call — returns the size of the pending queue. Use this as the
opening move every shift to know whether you have 3 requests or 300.
Get Permit Application Detail
threatlocker_approvals_get_permit_application
Returns the application that would be permitted if the request is
approved — including which group(s) the approval would scope to and
what other endpoints would be affected. Always check this before
approving anything that looks like it could have a wider blast radius
than expected.
Common Workflows
Daily Queue Triage
threatlocker_approvals_pending_count — sets expectations.
threatlocker_approvals_list with status: "Pending",
orderBy: "dateRequested", isAscending: true (oldest first).
- Group results by
fileHash — many requests are duplicates of the
same binary asked for from multiple endpoints. Decide once, apply
broadly.
- Within each hash, classify (see heuristics below).
- For approves, call
threatlocker_approvals_get_permit_application
to confirm scope. Then approve.
- For denies, capture a reason that the requesting user can act on.
Signed-Publisher Heuristics
Signals that increase confidence to approve:
signerVerified: true AND signer is a known vendor (Microsoft,
Adobe, JetBrains, Mozilla, Google, etc.).
filePath is in a vendor-installed location (C:\Program Files\...).
- The same hash has been previously approved for other endpoints.
- The requester user matches the computer's primary user.
- Justification includes a specific business reason ("Need Wireshark
for ticket INC-5123").
Signals that warrant needs-review or deny:
- Unsigned or signer-unverified binary.
- Path is in
%TEMP%, %APPDATA%, Downloads, or C:\Users\Public.
- File name mimics a system binary (
svchost, lsass, runtime)
but path is unusual.
- Justification is empty, generic ("need this"), or copy-pasted across
many requests.
- Hash has been denied previously, especially with a security reason.
Hard escalation triggers — surface to a senior analyst:
- Known LOLBin (
certutil, mshta, bitsadmin) requested from a
user-writable path.
- RAT/remote-tool installer (
AnyDesk, ConnectWise Control,
ScreenConnect) requested by an end user rather than IT.
- Phishing dropper indicators — Office macros, ISO-mounted shortcuts,
HTA files.
Bulk Approve Pattern
When a single hash appears across many requests:
- Pick one representative request and review fully.
- Approve via the application — the resulting policy will cover all
endpoints in the chosen group.
- The other pending requests for the same hash typically resolve
automatically once the application is permitted at group scope.
- Re-pull pending after a minute and confirm the duplicates cleared.
Edge Cases
- Vendor binaries with broken signatures — Newer versions of some
legitimate apps occasionally ship with signature timing issues.
Verify the hash with VirusTotal or the vendor before approving an
unsigned binary that should be signed.
- Self-signed installers — Common in line-of-business apps.
Approve on hash, not signer.
- Stale requests — A request older than 30 days where the user has
since left the org should usually be denied with a "stale request"
reason.
- Status transitions — A request in
Approved/Denied is
terminal; do not attempt to re-process it. Filter to Pending only.
Best Practices
- Always document a one-line reason on every decision — the audit log
is your defense if a policy change ever needs review.
- Approve at the application level (hash + signer), not file path —
paths drift, hashes don't.
- Re-check the queue immediately after a bulk approve to confirm
duplicate requests resolved.
- For unfamiliar binaries, check the audit log (
audit-log skill) to
see what the binary actually did before deciding.
Related Skills
1---2name: threatlocker-approval-requests3description: ThreatLocker application approval request triage: pulling the pending queue, grouping requests by application and hash, signed-publisher and path heuristics, and approve/deny recommendations with audit-friendly reasoning.4---56# ThreatLocker Approval Requests78Approval requests are how ThreatLocker users ask for an application9that's currently being blocked to be permitted. Each request carries10rich context — file path, hash, signer, the user who asked, the11computer it ran on, and a free-text justification. Triaging this queue12well is the difference between a productive ThreatLocker deployment13and a frustrated client.1415## Anti-triggers1617- **A malware detection.** ThreatLocker is default-deny allowlisting, not18 EDR — it blocks everything unlisted and has no verdict on whether a19 binary is malicious. A request in this queue means "policy said no",20 not "something was detected". Convictions and confirmed threats are21 `sentinelone-alerts` or `huntress-incidents`.22- **What the binary actually did on the endpoint.** The request record23 carries only the metadata the user submitted; execution history,24 process chain, and prior blocks are `threatlocker-audit-log`.25- **Which endpoints an approval would cover.** Permits land at group26 scope, so the blast radius question is `threatlocker-computer-groups`.2728## API Tools2930### List Approval Requests3132```33threatlocker_approvals_list34```3536POST-based `GetByParameters` — see `api-patterns`. Useful filters via37`searchText`: file name, application name, requester user, computer38name. Each request typically includes:3940- `requestId`, `applicationName`, `fileName`, `filePath`, `fileHash`41- `signer` (Authenticode publisher), `signerVerified` boolean42- `requesterUser`, `computerName`, `computerId`, `organizationName`43- `justification` (free-text from the user), `dateRequested`44- `status` — `Pending`, `Approved`, or `Denied`4546### Get Approval Request4748```49threatlocker_approvals_get50```5152Full detail for one request — includes additional context like the53specific policy that blocked it and any prior history of the same hash.5455### Pending Count5657```58threatlocker_approvals_pending_count59```6061Cheap call — returns the size of the pending queue. Use this as the62opening move every shift to know whether you have 3 requests or 300.6364### Get Permit Application Detail6566```67threatlocker_approvals_get_permit_application68```6970Returns the application that *would be permitted* if the request is71approved — including which group(s) the approval would scope to and72what other endpoints would be affected. Always check this before73approving anything that looks like it could have a wider blast radius74than expected.7576## Common Workflows7778### Daily Queue Triage79801. `threatlocker_approvals_pending_count` — sets expectations.812. `threatlocker_approvals_list` with `status: "Pending"`,82 `orderBy: "dateRequested"`, `isAscending: true` (oldest first).833. Group results by `fileHash` — many requests are duplicates of the84 same binary asked for from multiple endpoints. Decide once, apply85 broadly.864. Within each hash, classify (see heuristics below).875. For approves, call `threatlocker_approvals_get_permit_application`88 to confirm scope. Then approve.896. For denies, capture a reason that the requesting user can act on.9091### Signed-Publisher Heuristics9293Signals that increase confidence to **approve**:9495- `signerVerified: true` AND `signer` is a known vendor (Microsoft,96 Adobe, JetBrains, Mozilla, Google, etc.).97- `filePath` is in a vendor-installed location (`C:\Program Files\...`).98- The same hash has been previously approved for other endpoints.99- The requester user matches the computer's primary user.100- Justification includes a specific business reason ("Need Wireshark101 for ticket INC-5123").102103Signals that warrant **needs-review** or **deny**:104105- Unsigned or signer-unverified binary.106- Path is in `%TEMP%`, `%APPDATA%`, `Downloads`, or `C:\Users\Public`.107- File name mimics a system binary (`svchost`, `lsass`, `runtime`)108 but path is unusual.109- Justification is empty, generic ("need this"), or copy-pasted across110 many requests.111- Hash has been denied previously, especially with a security reason.112113Hard escalation triggers — surface to a senior analyst:114115- Known LOLBin (`certutil`, `mshta`, `bitsadmin`) requested from a116 user-writable path.117- RAT/remote-tool installer (`AnyDesk`, `ConnectWise Control`,118 `ScreenConnect`) requested by an end user rather than IT.119- Phishing dropper indicators — Office macros, ISO-mounted shortcuts,120 HTA files.121122### Bulk Approve Pattern123124When a single hash appears across many requests:1251261. Pick one representative request and review fully.1272. Approve via the application — the resulting policy will cover all128 endpoints in the chosen group.1293. The other pending requests for the same hash typically resolve130 automatically once the application is permitted at group scope.1314. Re-pull pending after a minute and confirm the duplicates cleared.132133## Edge Cases134135- **Vendor binaries with broken signatures** — Newer versions of some136 legitimate apps occasionally ship with signature timing issues.137 Verify the hash with VirusTotal or the vendor before approving an138 unsigned binary that *should* be signed.139- **Self-signed installers** — Common in line-of-business apps.140 Approve on hash, not signer.141- **Stale requests** — A request older than 30 days where the user has142 since left the org should usually be denied with a "stale request"143 reason.144- **Status transitions** — A request in `Approved`/`Denied` is145 terminal; do not attempt to re-process it. Filter to `Pending` only.146147## Best Practices148149- Always document a one-line reason on every decision — the audit log150 is your defense if a policy change ever needs review.151- Approve at the application level (hash + signer), not file path —152 paths drift, hashes don't.153- Re-check the queue immediately after a bulk approve to confirm154 duplicate requests resolved.155- For unfamiliar binaries, check the audit log (`audit-log` skill) to156 see what the binary actually did before deciding.157158## Related Skills159160- [api-patterns](../api-patterns/SKILL.md) — Auth and pagination161- [audit-log](../audit-log/SKILL.md) — Behavior of binaries before162 approval decisions163- [computers](../computers/SKILL.md) — Endpoint context for requests164- [computer-groups](../computer-groups/SKILL.md) — Policy scope of165 the resulting permit