‘signtool’ Is Not Recognized: Fix PATH and SDK Resolution

If a shell, build, IDE task or CI job says 'signtool' is not recognized as an internal or external command, that failing process cannot resolve the command. First prove whether signtool.exe exists, then prove which SDK version/architecture the workflow intends to use and what environment the failing process actually receives. A terminal where SignTool works does not prove MSBuild, an IDE, service, scheduled task or CI step sees the same PATH.

Windows SDK · SignTool · PATHWindows 10/11 · Visual Studio · CI/CDLast reviewed Sep 27, 2026
🎯 You’re likely in the right place if:
cmd.exe reports ‘signtool’ is not recognized as an internal or external command.PowerShell cannot resolve signtool, or a build/CI job says the command is missing.You need to distinguish a PATH/environment problem from SignTool actually being absent.
Choose the path that matches your result
Exact SDK path works, plain signtool does notSignTool is installed; this is command resolution/PATH.
Developer PowerShell finds signtoolUse that build environment or configure your build with the exact path.
No signtool.exe exists under Windows KitsStop here and use the SignTool.exe Not Found guide; this is an SDK installation problem.
Works locally but fails in CI/CDDiagnose the runner separately; your local PATH does not carry into CI.
Difficulty: Easy–ModerateRisk: Low first
🔎 Quick Check — separate “not installed” from “not on PATH”

In PowerShell, check command resolution first, then search the Windows SDK if the command is unresolved.

Get-Command signtool.exe -ErrorAction SilentlyContinue
Get-ChildItem "${env:ProgramFiles(x86)}\Windows Kits\10\bin" -Filter signtool.exe -Recurse -ErrorAction SilentlyContinue | Select-Object -First 10 -ExpandProperty FullName

Interpret the result: if the first command returns nothing but the second returns an SDK path, the executable exists but your current environment cannot resolve signtool. If neither finds it, switch to SignTool.exe Not Found instead of editing PATH.

Did the SDK search find SignTool.exe?
ADSENSE · reserved slot after the first useful step

Why Windows says ‘signtool’ is not recognized

SignTool is installed with the Windows SDK under a versioned SDK bin directory. A normal cmd or PowerShell session does not necessarily include that versioned directory on PATH. Visual Studio Developer Command Prompt and Developer PowerShell are designed to load build-tool environment settings, which is why the same command can work there but fail in a normal terminal.

Diagnose the environment before changing PATH

1
Can the exact executable run?
Take a path returned by the SDK search and run it with /?. If help opens, the binary is healthy enough to stop troubleshooting installation.
2
Does it work in Developer PowerShell/Command Prompt?
If yes, the difference is the environment, not the certificate you intend to use later.
3
Does only MSBuild, an IDE task, service, scheduled task or CI job fail?
Capture the environment inside that exact process/job. Parent-process startup time, service accounts and pipeline step boundaries can all make its PATH differ from your interactive shell.

Fix #1 — use the exact SDK path

This is the safest proof and often the cleanest build configuration because it avoids a machine-wide PATH edit. Replace the placeholders with a path that actually exists on your machine.

& 'C:\Program Files (x86)\Windows Kits\10\bin\<SDK_VERSION>\x64\signtool.exe' /?

Verify: SignTool help should appear from the exact SDK copy you selected. Record that full path/version/architecture. This proves that copy can launch; it does not yet prove the original failing build process resolves the same executable.

Fix #2 — use Visual Studio Developer PowerShell or Command Prompt

If Visual Studio is installed, open its Developer PowerShell or Developer Command Prompt and test the command there. Microsoft documents these shells as the normal way to run SignTool in a Visual Studio environment.

signtool /?

Verify: if signtool /? works only in the Developer shell, keep using that environment for the signing/build step or configure the build with the exact SDK path.

Fix #3 — test a session-only PATH before making it persistent

If a script truly needs the plain signtool command, test the correct SDK directory in the current PowerShell session first. This disappears when the shell closes and is safer than immediately changing the machine PATH.

$env:Path = "C:\Program Files (x86)\Windows Kits\10\bin\<SDK_VERSION>\x64;" + $env:Path signtool /?
🟡 Before you persist PATH: use the one SDK version/architecture your workflow actually needs. Do not add every Windows Kits directory.

Verify: in the same session run Get-Command signtool.exe and confirm it resolves to the intended SDK copy. Then rerun the original failing command from its real process/context; a successful interactive-shell test alone is not final verification.

Works locally but not in CI/CD?

Treat the runner—and each relevant job/container/step—as its own environment. First search for the executable inside the failing job. If absent, provision the supported Windows SDK/tooling there; if present, select the intended SDK copy and expose its directory to the step/process that invokes signing. Do not infer runner state from your development PC or from a different pipeline step.

Important: do not hard-code a local developer-machine SDK path into a hosted runner unless that same path/version is actually present there.

Verify: make the pipeline print the resolved SignTool path and run signtool /? before the signing command. That separates tool discovery from later certificate/signing failures.

What not to do

Do not download a loose SignTool.exe or SDK DLLs from unofficial binary sites.Do not add every installed Windows SDK version to PATH “just in case”.Do not disable signing or start changing certificates to solve a command-not-recognized error.Do not assume a CI runner has the same SDK or PATH as your workstation.Do not assume the first signtool.exe found recursively is the SDK version/architecture your workflow intends to use.Do not treat success in an interactive terminal as proof that MSBuild, an IDE, service, scheduled task or CI step inherited the same environment.Do not persist a PATH entry until the exact SDK copy and failing process context are known.Do not keep diagnosing command discovery after SignTool launches and the error changes to certificate, digest, timestamp or signing failure.

Still seeing the error?

Capture these before escalating:the exact error and whether it came from cmd, PowerShell, MSBuild or CIoutput of Get-Command signtool.exethe full SDK paths returned by the Windows Kits searchwhether the exact path plus /? worksthe SDK version/architecture your build expectsthe PATH visible inside the failing process or runnerthe exact SignTool full path, SDK version and architecture selected for the workflowwhether the failure follows cmd/PowerShell only or the actual MSBuild/IDE/service/task/CI processthe resolved SignTool path printed inside the exact failing job/stepthe first different error after command resolution succeeds

If the SDK search returns no executable at all, the correct next page is SignTool.exe Not Found: Find the Windows SDK Path First. If the executable launches and your next error mentions certificates, digest algorithms, timestamps or file signing, you have moved past command discovery and should troubleshoot that new error separately.

Official references

Still stuck? Ask the community

Share the exact shell/build error, the SDK paths you found, and whether the full executable path works. That makes the next diagnosis much faster.

Keep it safe: never post signing-certificate private keys, passwords, API keys, access tokens, recovery codes, private URLs or confidential build logs.
Powered by GitHub DiscussionsSign in with GitHub to comment. Reading comments does not require sign-in.

Loading community discussion…