🦊 MigrationFox Docs

Why .exe, .dll, and other executables show as Skipped

If your migration report has a non-zero Skipped count and your content included software installers or build artifacts, this is why. Executable files are blocked on both ends of a Google Drive → SharePoint migration, for different reasons, and MigrationFox detects both policies at pre-flight so the migration doesn't waste API budget trying.

Example completion report for an IT team shared drive. Two distinct Skipped columns: source-side (Google refused the download) and destination-side (SharePoint policy block).

WHAT YOU'LL SEE

Two Skipped tiles, not one. "Source" = Google Drive refused to give us the bytes. "Dest" = we had the bytes, but SharePoint's tenant policy wouldn't accept the upload. Every file listed has a source path and the exact rule that matched — this is the punch list for whatever you need to move a different way.

Why Google Drive blocks downloads of executables

Google Drive runs an opportunistic malware scan on download. For files under 25 MB the scan runs inline and most binaries come through fine. For files over 25 MB, the scan can't run synchronously, so the API returns a 403 cannotDownloadAbusiveFile on any file Drive considers high-risk — typically installers, archives of binaries, unsigned DLLs, and anything Drive's heuristic flagged as "potentially malicious" regardless of whether it actually is.

There is a per-file override parameter (acknowledgeAbuse=true) that a signed-in owner of the file can set to force the download. Service accounts and OAuth apps cannot set it — it must be the file's owner, clicking a warning banner, in the UI. MigrationFox cannot impersonate a human click, so we log these as source-side skips and list them on the report with enough detail for the file's owner to download manually.

Why SharePoint has a blocked-file-types policy

Every Microsoft 365 tenant has a DisallowedFileTypes list, editable by a SharePoint Admin. Uploading a file whose extension is on the list returns HTTP 400 with a blocked-file-type error. The default list exists because executable content in document libraries is a malware-delivery vector that OneDrive/SharePoint's scanner cannot fully inspect (code-signed installers, macro-laden Office files with double extensions, script runners).

The default is conservative but the tenant admin can relax it. Many IT teams with legitimate installer repositories do exactly this — usually by removing .exe, .msi, and .ps1 from the tenant default and leaving the malware-heavy extensions (.bat, .vbs, .js at root) blocked.

SharePoint default blocked-file-types list

The default DisallowedFileTypes varies slightly across tenant vintages but these are the extensions every current tenant ships blocked:

ExtensionDescription
.ashxASP.NET HTTP handler — executable at URL if uploaded to certain paths.
.asmxASP.NET web service endpoint — same risk class as .ashx.
.aspxASP.NET Web Forms page — can contain code-behind that runs in-process.
.batWindows batch script — runs verbatim in cmd.exe.
.cmdModern Windows command script; same risk as .bat.
.comLegacy DOS executable — still runs on Windows.
.dllWindows dynamic-link library — loaded by other executables.
.exeWindows portable executable — the canonical installer/binary extension.
.htm / .htmlHTML page — can host script content that runs in browser if served from SharePoint.
.insInternet Communications Settings — can reconfigure Windows network stack.
.ispInternet Communications Service Provider — related to .ins.
.jarJava archive — executable with a JRE installed.
.jsJavaScript file — runs via Windows Script Host or in a page context.
.jseEncoded JScript — obfuscated .js.
.lnkWindows shortcut — can point at an arbitrary executable.
.mdeCompiled Access database with code.
.mht / .mhtmlMIME HTML archive — historically used to smuggle script payloads.
.msh, .msh1, .msh2Microsoft Shell (early PowerShell) script.
.msiWindows Installer package.
.mspWindows Installer patch package.
.ps1, .ps1xml, .ps2, .psc1, .psc2PowerShell script and related manifest types.
.regWindows registry merge file — can silently modify system config.
.scfWindows Explorer command file.
.scrWindows screensaver — effectively a renamed .exe.
.shtmlServer-side include — executes in certain SP configurations.
.soapSOAP service definition.
.svcWCF service endpoint.
.vb, .vbe, .vbsVBScript variants — ran automatically by Windows Script Host.
.ws, .wsc, .wsf, .wshWindows Script Host container formats.

Your tenant's effective list can differ — admins add or remove entries over the years and rarely document the change. Always check your own tenant's policy before making assumptions.

How to check your destination tenant's policy

From a PowerShell session with the SharePoint Online module installed:

Install-Module Microsoft.Online.SharePoint.PowerShell -Scope CurrentUser
Connect-SPOService -Url https://<tenant>-admin.sharepoint.com
(Get-SPOTenant).DisallowedFileTypes

The output is a semicolon-separated string of extensions, no dots. If it's empty, the tenant has disabled blocking entirely (uncommon, and not recommended).

How to relax it if you need installers in SharePoint

Two approaches. Pick based on how permanent the need is.

Temporary removal for the cutover window

Relax the policy just long enough to run the migration, then restore it. Run as a SharePoint Admin:

# Capture current list so you can restore it after
$before = (Get-SPOTenant).DisallowedFileTypes

# Relax — example: allow .exe, .msi, .dll, .ps1
Set-SPOTenant -DisallowedFileTypes "ashx;asmx;aspx;bat;cmd;com;htm;html;ins;isp;jar;js;jse;lnk;mde;mht;mhtml;msh;msh1;msh2;msp;reg;scf;scr;shtml;soap;svc;vb;vbe;vbs;ws;wsc;wsf;wsh"

# Run the migration...

# Restore original policy
Set-SPOTenant -DisallowedFileTypes $before

Changes propagate across the tenant within a few minutes. The MigrationFox pre-flight check re-reads the policy at job start, so a mid-day relaxation will only take effect on jobs you start after the change.

PowerShell cmdlet admins use

The exact cmdlet is Set-SPOTenant -DisallowedFileTypes "<semicolon-separated list>". Pass the full replacement list — the parameter is not additive. Missing an extension off your new list silently allows it. Always capture (Get-SPOTenant).DisallowedFileTypes first so you can restore.

Permanent relaxation for an installer library

Tenant-wide relaxation is appropriate if your IT team needs an installer repository in SharePoint as a normal working practice. Best practice: create a dedicated site collection for installers, lock down membership, and remove only the minimum extensions from the tenant list. Layering a site-level policy on top to re-block is not possible — DisallowedFileTypes is a tenant-level setting only.

What MigrationFox does automatically

DON'T

Don't work around the policy by zipping executables into .zip archives on the source before migrating. SharePoint's malware scanner unpacks zips and blocks the contents at download time — so the file uploads successfully but nobody can retrieve it. If you need installers in SharePoint, relax the tenant policy or move them somewhere else (Azure Blob, a software repo) instead.

What's next