<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2695996363157291447</id><updated>2026-10-10T09:38:21.318+03:00</updated><title type='text'>Troubleshooter Extraordinaire :)</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-5476707750184390573</id><published>2026-10-01T11:42:21.257+03:00</published><updated>2026-10-01T11:42:21.258+03:00</updated><title type='text'>One Drive to Rule Them All: Consolidating Mail, Files and Media from Many Accounts into Google Drive</title><content type='html'>&lt;p&gt;Written with the help of Claude AI&lt;/p&gt;&lt;p&gt;&lt;time class=&quot;ldoc-chip&quot; data-atom=&quot;date&quot; data-chip=&quot;date&quot; data-ts=&quot;&amp;quot;2026-10-01&amp;quot;&quot; datetime=&quot;2026-10-01&quot;&gt;&lt;br /&gt;&lt;/time&gt;&lt;/p&gt;&lt;h2 id=&quot;the-problem-one-person-too-many-accounts&quot;&gt;The problem: one person, too many accounts&lt;/h2&gt;&lt;p&gt;Most people don&#39;t plan their digital footprint. They accumulate it. A personal Gmail from university, an Outlook.com address from an old job, a OneDrive that came free with an Office subscription, a second Google account set up for a side business. Years later, the emails, documents, spreadsheets and family photos are spread across all of them.&lt;/p&gt;&lt;p&gt;That was the situation for a recent client. They had moved onto a Google Workspace account on their own domain and wanted everything else consolidated there: mail into the Workspace mailbox, and every file, folder, photo and video into a single, organised Google Drive.&lt;/p&gt;&lt;p&gt;It sounds like a copy-and-paste job. It isn&#39;t. This post walks through the four stages we went through, the traps we hit along the way, and the scripts that got us out of them.&lt;/p&gt;&lt;p&gt;The overall plan was simple:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Move each mailbox into the Workspace account.&lt;/li&gt;&lt;li&gt;Copy each account&#39;s files into Google Drive, one top-level folder per source account.&lt;/li&gt;&lt;li&gt;Clean up the side effects of the copy.&lt;/li&gt;&lt;li&gt;Pull all photos and videos out into a single Media folder.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;step-1-email-moving-every-mailbox-into-workspace-gmail&quot;&gt;Step 1: Email — moving every mailbox into Workspace Gmail&lt;/h2&gt;&lt;p&gt;Mail is the easiest piece to verify and the one people miss most when it&#39;s gone, so we did it first. The right tool depends entirely on where the mail lives today:&lt;/p&gt;&lt;table style=&quot;min-width: 144px;&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Source mailbox&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Best route into Workspace Gmail&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Needs&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Personal Gmail&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Admin console &lt;strong&gt;data import tool&lt;/strong&gt; (Gmail source)&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Workspace super admin; the Gmail owner approves a request&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Personal Outlook.com / Hotmail&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Classic Outlook for Windows + Google&#39;s &lt;strong&gt;GWMMO&lt;/strong&gt; tool (via PST)&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;A Windows PC with desktop Outlook&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Any other IMAP provider (Yahoo, iCloud, Zoho...)&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Admin console data import tool (IMAP source)&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;The mailbox password or an app password&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Whichever route you take, moving the mail is only half the job. The other half is telling the rest of the world about the new address, and that part is manual.&lt;/p&gt;&lt;h3 id=&quot;personal-gmail-to-workspace-gmail&quot;&gt;Personal Gmail to Workspace Gmail&lt;/h3&gt;&lt;p&gt;Google Workspace has a built-in, free &lt;strong&gt;data import tool&lt;/strong&gt; that pulls mail directly from a personal Gmail account into a Workspace mailbox, labels and all. Nothing is downloaded or re-uploaded. It used to be called the Data Migration Service, and older guides (including our own first notes) mention app passwords. The current version uses an authorisation request instead, which is simpler and safer.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Before you start&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You need a &lt;strong&gt;super administrator&lt;/strong&gt; login for the Workspace tenant.&lt;/li&gt;&lt;li&gt;The target user must have a Workspace licence with Gmail turned on.&lt;/li&gt;&lt;li&gt;If the personal Gmail account is enrolled in Google&#39;s &lt;strong&gt;Advanced Protection Program&lt;/strong&gt;, it has to be turned off before the import is set up and for as long as it runs.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Step by step&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;In the Admin console, go to &lt;strong&gt;Menu → Data → Data import &amp;amp; export → Data import&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Under &lt;strong&gt;Gmail&lt;/strong&gt;, click &lt;strong&gt;Import&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Enter the personal Gmail address as the &lt;strong&gt;Source email address&lt;/strong&gt; and click &lt;strong&gt;Request authorization&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;The Gmail account owner gets an email and approves the request. If you own the account, you can approve it directly from the Admin console. The request expires after 24 hours; use &lt;strong&gt;Refresh request&lt;/strong&gt; to resend.&lt;/li&gt;&lt;li&gt;Once the status shows &lt;strong&gt;Connected&lt;/strong&gt;, enter the Workspace address as the &lt;strong&gt;Target account&lt;/strong&gt; and click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Choose the import settings. With no start date, everything from 1 January 2000 onward is imported. Optionally include deleted and spam messages, or exclude labels by name (sub-labels as &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Parent/Child&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;Click &lt;strong&gt;Start import&lt;/strong&gt;. Progress counts update live: emails discovered, imported, skipped and failed. You can close the page; Google emails a report when it finishes.&lt;/li&gt;&lt;li&gt;Run a &lt;strong&gt;delta import&lt;/strong&gt; later to pick up anything that arrived in the old account after the first pass.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;What carries over, and what doesn&#39;t&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Mail and labels come across. Contacts, calendars, filters, signatures and the old account&#39;s &quot;Send mail as&quot; settings do not. For a single person these are quick by hand:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Contacts:&lt;/strong&gt; export from Google Contacts on the old account (Google CSV), import on the new one.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Calendars:&lt;/strong&gt; export from Google Calendar settings (&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.ics&lt;/code&gt;) and import, or simply share the old calendar with the new account.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Filters:&lt;/strong&gt; Gmail settings → Filters → export as XML on the old account, import on the new one.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Bridging the gap&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Until everyone has the new address, set the old Gmail to auto-forward to the Workspace address (Settings → Forwarding and POP/IMAP). Add a filter in the new mailbox that labels anything sent to the old address. That label becomes your to-do list for the subscription clean-up below.&lt;/p&gt;&lt;p&gt;Google&#39;s full walkthrough: &lt;a href=&quot;https://knowledge.workspace.google.com/admin/migrate/import-email-with-the-data-import-tool&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Import email with the data import tool&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;personal-outlookcom-to-workspace-gmail&quot;&gt;Personal Outlook.com to Workspace Gmail&lt;/h3&gt;&lt;p&gt;This is the awkward one. The data import tool&#39;s IMAP option asks for the mailbox password, and personal Microsoft accounts (&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;@outlook.com&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;@hotmail.com&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;@live.com&lt;/code&gt;) &lt;a href=&quot;https://support.microsoft.com/office/outlook-and-other-apps-are-unable-to-connect-to-outlook-com-f4202ebf-89c6-4a8a-bec3-3d60cf7deaef&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;stopped accepting passwords and app passwords over IMAP in September 2024&lt;/a&gt;. Only modern sign-in (OAuth) works now. The data import tool&#39;s Exchange Online option is built for business Microsoft 365 tenants, not personal accounts.&lt;/p&gt;&lt;p&gt;So the reliable route goes through a Windows PC and two pieces of desktop software: classic Outlook, which signs in to Outlook.com properly, and Google&#39;s free &lt;a href=&quot;https://knowledge.workspace.google.com/admin/migrate/about-gwmmo&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;GWMMO&lt;/a&gt; (Google Workspace Migration for Microsoft Outlook), which imports a PST file into a Workspace account.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step by step&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Install classic Outlook for Windows&lt;/strong&gt; (Outlook 2021 or the Microsoft 365 desktop app). Older versions, and the web, Mac and &quot;new Outlook&quot; apps, won&#39;t work for this.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Add the Outlook.com account&lt;/strong&gt; using automatic setup, so it connects with a Microsoft sign-in page rather than a password box. Let it sync completely; for a large mailbox, set the offline cache to keep &lt;strong&gt;all&lt;/strong&gt; mail, not just the last year.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Export to PST:&lt;/strong&gt; File → Open &amp;amp; Export → Import/Export → Export to a file → Outlook Data File (.pst). Select the top of the mailbox and tick &lt;strong&gt;Include subfolders&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Install GWMMO&lt;/strong&gt; from Google&#39;s download page, with Outlook closed.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Run GWMMO&lt;/strong&gt;, sign in with the &lt;em&gt;Workspace&lt;/em&gt; account, and choose &lt;strong&gt;From PST file(s)&lt;/strong&gt; as the source.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Pick what to import:&lt;/strong&gt; email, calendar and contacts can go together or separately. Optionally skip junk and deleted items, or limit by date.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Start the import&lt;/strong&gt; and leave the PC on. Outlook folders become Gmail labels.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If the PST is too large to export cleanly, export it in date ranges or folder by folder and run GWMMO once per file.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Other routes we considered&lt;/strong&gt;&lt;/p&gt;&lt;table style=&quot;min-width: 144px;&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Route&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;When it makes sense&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Catch&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Thunderbird with both accounts added (OAuth for Outlook.com), drag folders across&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;No Windows PC, small mailbox&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Slow, manual, easy to miss folders&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;imapsync with OAuth access tokens&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Comfortable on the command line&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Getting a Microsoft OAuth token is the fiddly part&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Commercial migration services&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Several mailboxes, little time&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Paid; you hand a third party access to both accounts&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Data import tool, IMAP option&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Other IMAP providers (Yahoo, iCloud, Zoho)&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Doesn&#39;t work for Outlook.com any more&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;Bridging the gap&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In Outlook.com, turn on forwarding to the Workspace address (Settings → Mail → Forwarding) and tick &lt;strong&gt;Keep a copy&lt;/strong&gt;. As with Gmail, a filter in the new mailbox labels anything that arrives via the old address.&lt;/p&gt;&lt;h3 id=&quot;the-manual-part-subscriptions-logins-and-the-old-address&quot;&gt;The manual part: subscriptions, logins and the old address&lt;/h3&gt;&lt;p&gt;No tool moves this part for you. Every bank, utility, shop, school portal and newsletter knows the old address, and each one has to be changed by hand on its own website. This took longer than the mail import itself.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. Build the list&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;We built an inventory from three places, in a simple sheet with columns for service, old address, category, changed (yes/no) and notes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The old mailboxes.&lt;/strong&gt; Search them for words that only service emails use: &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;unsubscribe&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;receipt&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;invoice&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;verify your email&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;password reset&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;welcome to&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;your order&lt;/code&gt;. Sort by sender and you have most of the list in an hour.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The password manager&lt;/strong&gt; (or the browser&#39;s saved passwords). Every saved login whose username is the old address is a service to update.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&quot;Sign in with Google&quot; and &quot;Sign in with Microsoft&quot;.&lt;/strong&gt; Check the old account&#39;s security page for third-party apps with account access. These logins are tied to the old &lt;em&gt;account&lt;/em&gt;, not just its address, and are covered below.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2. Work through it by priority&lt;/strong&gt;&lt;/p&gt;&lt;table style=&quot;min-width: 144px;&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Priority&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Examples&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Why&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;First&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Banks, cards, tax, government portals, insurers, utilities&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Missing one of these has real consequences; many need extra verification to change&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Second&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Phone carrier, domain registrar, cloud and software subscriptions, shopping accounts with saved payment&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Billing and account recovery depend on them&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Third&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Social media, forums, loyalty schemes&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Nice to have; batch them&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Last&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Newsletters and marketing&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Unsubscribe from most rather than moving them; it&#39;s a free clean-up&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;For each service: log in, change the email, confirm the verification link that arrives in the new mailbox, and tick it off. Where a site won&#39;t let you change the email, note it and decide whether to keep the old account just for that service or close and re-register.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. The things that don&#39;t move&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Purchases and subscriptions tied to the account itself.&lt;/strong&gt; Apps, films and books bought on Google Play, YouTube or Google One subscriptions on the old Google account, and a Microsoft 365 Personal subscription on the old Microsoft account stay with those accounts. Cancel and re-subscribe on the new account where it makes sense, or keep the old account for them.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&quot;Sign in with Google/Microsoft&quot; logins.&lt;/strong&gt; Most sites let you add a password or link a new sign-in method from their account settings. Do that before you stop using the old account.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Recovery details.&lt;/strong&gt; Make the new address the recovery email on anything important, and check the old accounts&#39; own recovery phone and email are still current.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;4. Don&#39;t delete the old accounts&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Keep the old Gmail and Outlook.com accounts open, forwarding to the new address, for at least six months to a year. The &quot;via old address&quot; label shows what you missed; when it&#39;s been quiet for a few months, you&#39;re done. Sign in to each old account every so often: both Google and Microsoft can close personal accounts that sit unused for long enough, and the old address is still the recovery route for anything you forgot.&lt;/p&gt;&lt;h2 id=&quot;step-2-files-rclone-and-the-spreadsheet-that-vanished&quot;&gt;Step 2: Files — rclone, and the spreadsheet that vanished&lt;/h2&gt;&lt;p&gt;For files, we used &lt;strong&gt;rclone&lt;/strong&gt;, which talks to Google Drive, OneDrive and dozens of other storage services. Each source account got its own top-level folder in the destination Drive, named after the account. That kept provenance clear: you can always tell where a file came from.&lt;/p&gt;&lt;h3 id=&quot;setting-up-the-remotes&quot;&gt;Setting up the remotes&lt;/h3&gt;&lt;p&gt;In rclone, each account is a &lt;em&gt;remote&lt;/em&gt;. We created one per source account and one for the destination. The names below are placeholders:&lt;/p&gt;&lt;table style=&quot;min-width: 192px;&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Remote&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Scope (recommended)&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Role&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;src-g1:&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Google Drive (personal)&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;drive.readonly&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Source&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;src-g2:&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Google Drive (second account)&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;drive.readonly&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Source&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;src-od:&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;OneDrive Personal&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;default&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Source&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;dst:&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Google Drive (Workspace)&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;drive&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Destination&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;A Google Drive remote is created with &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;rclone config&lt;/code&gt;. The answers that matter:&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;rclone config
n) New remote
name&amp;gt; dst
Storage&amp;gt; drive
client_id&amp;gt; 1234567890-xxxx.apps.googleusercontent.com   # your own, see below
client_secret&amp;gt; GOCSPX-xxxx
scope&amp;gt; 1                         # &quot;drive&quot; = full access (destination)
service_account_file&amp;gt;            # blank
Edit advanced config? n
Use web browser to automatically authenticate? y
Configure this as a Shared Drive (Team Drive)? n
Keep this &quot;dst&quot; remote? y&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A few settings are worth calling out:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;client_id / client_secret.&lt;/strong&gt; Leaving these blank uses rclone&#39;s shared client ID, which is being retired in 2026. Create your own. The next section covers why and how.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;scope.&lt;/strong&gt; Use &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;drive&lt;/code&gt; (full access) on the destination. On source accounts, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;drive.readonly&lt;/code&gt; is the safer choice: rclone can read and download but cannot rename or delete anything. We learned this the hard way in Step 3.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Shared Drive.&lt;/strong&gt; Answer &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;y&lt;/code&gt; only if the destination is a Shared Drive rather than a user&#39;s My Drive.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Browser authentication.&lt;/strong&gt; rclone opens a local web page on &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;127.0.0.1:53682&lt;/code&gt; to receive the token. On a machine without a browser, answer &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;n&lt;/code&gt; and use &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;rclone authorize&lt;/code&gt; on another machine.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For OneDrive, choose &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Storage&amp;gt; onedrive&lt;/code&gt;, keep the region as global, sign in through the browser, then pick the OneDrive Personal drive when prompted. Office files in OneDrive are real &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.docx&lt;/code&gt; and &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.xlsx&lt;/code&gt; files, so they don&#39;t have the export problem described below.&lt;/p&gt;&lt;p&gt;Before copying anything, check each remote can see what you expect:&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;rclone listremotes
rclone lsd src-g1:          # top-level folders
rclone size src-g1:         # file count and total size
rclone about dst:           # free space on the destination&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;the-copy-commands&quot;&gt;The copy commands&lt;/h3&gt;&lt;p&gt;Each source went into its own folder under the destination. Always start with a dry run:&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;rclone copy src-g1: &quot;dst:Users/Account A&quot; --dry-run -v&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then the real run, with logging and progress:&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;rclone copy src-g1: &quot;dst:Users/Account A&quot; \
  --drive-export-formats ods,odt,odp \
  --drive-import-formats ods,odt,odp \
  --fast-list --transfers 4 --checkers 8 \
  --drive-stop-on-upload-limit \
  --log-file accountA.log -v -P

rclone copy src-od: &quot;dst:Users/Account C&quot; \
  --fast-list --transfers 4 \
  --log-file accountC.log -v -P&lt;/code&gt;&lt;/pre&gt;&lt;table style=&quot;min-width: 144px;&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Flag&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;What it does&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Why we used it&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;--dry-run&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Lists what would happen without changing anything&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Always first&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;--drive-export-formats ods,odt,odp&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Exports native Sheets, Docs and Slides as OpenDocument files&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Avoids name clashes with real Office files (explained below)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;--drive-import-formats ods,odt,odp&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Converts those files back to native Google files on upload&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Sheets arrive as Sheets, not &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.xlsx&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;--fast-list&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Batches directory listings into fewer API calls&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Much faster on large folder trees&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;--transfers 4 --checkers 8&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Parallel uploads and comparisons&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Stays under Drive&#39;s per-client rate limits&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;--drive-stop-on-upload-limit&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Stops cleanly at Drive&#39;s 750 GiB/day upload cap&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Re-run the next day instead of hammering errors&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;--log-file ... -v&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Writes every action to a log&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;An audit trail, and a way to reverse mistakes&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;-P&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Live progress&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Visibility on long runs&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;copy&lt;/code&gt; never deletes anything at the destination, which is why we used it instead of &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;sync&lt;/code&gt;. Because it skips files that already match, re-running the same command after an interruption simply resumes.&lt;/p&gt;&lt;p&gt;To verify regular files after each run:&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;rclone check src-g1: &quot;dst:Users/Account A&quot; --one-way --drive-skip-gdocs&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Native Google files report no size, so &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;check&lt;/code&gt; can&#39;t compare them. We spot-checked those by hand.&lt;/p&gt;&lt;p&gt;That&#39;s the clean version. Here&#39;s what went wrong the first time, before those export flags were added.&lt;/p&gt;&lt;p&gt;The copy ran fine until we checked the spreadsheets. Some native Google Sheets were simply missing at the destination.&lt;/p&gt;&lt;h3 id=&quot;why-it-happened&quot;&gt;Why it happened&lt;/h3&gt;&lt;p&gt;A native Google Sheet isn&#39;t a file on disk. When rclone copies one between accounts, it exports it to a real format, by default &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.xlsx&lt;/code&gt;, and uploads that. The source folders often had a Google Sheet and a genuine Excel file with the same name sitting side by side, for example &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Budget&lt;/code&gt; (Sheet) and &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Budget.xlsx&lt;/code&gt; (Excel). After export, both became &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Budget.xlsx&lt;/code&gt;, and rclone treated one as a duplicate of the other.&lt;/p&gt;&lt;p&gt;The obvious fix, rclone&#39;s &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;dedupe&lt;/code&gt; command, made things worse. It renamed the Sheets to &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Budget-1&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Budget-2&lt;/code&gt; and so on, and they then arrived at the destination as plain &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.xlsx&lt;/code&gt; files rather than native Sheets. Formulas survived; the Google-native file did not.&lt;/p&gt;&lt;p&gt;For the record, the command that caused the trouble was:&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;# Don&#39;t do this to fix export collisions
rclone dedupe --dedupe-mode rename src-g1:&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;rename&lt;/code&gt; mode is designed for genuine duplicate files, which Drive allows and most storage doesn&#39;t. It renames every item that shares a name, and it does so on the live remote. With a read-only scope on the source, this command would simply have failed.&lt;/p&gt;&lt;h3 id=&quot;fix-a-round-trip-through-ods&quot;&gt;Fix A: round-trip through ODS&lt;/h3&gt;&lt;p&gt;The cleaner rclone fix is to export native Google files to a format that doesn&#39;t collide with anything real, then convert them back on upload:&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;rclone copy src:Folder dst:Folder \
  --drive-export-formats ods,odt,odp \
  --drive-import-formats ods,odt,odp \
  --dry-run -vv&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sheets, Docs and Slides travel as &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.ods&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.odt&lt;/code&gt; and &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.odp&lt;/code&gt;, so they no longer clash with real &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.xlsx&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.docx&lt;/code&gt; and &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.pptx&lt;/code&gt; files, and they&#39;re re-imported as native Google files at the other end. Everything else (PDFs, Word and Excel files, images) is copied byte for byte. Drop &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;--dry-run&lt;/code&gt; once the listing looks right.&lt;/p&gt;&lt;p&gt;Two caveats: any genuine &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.ods&lt;/code&gt; files in the source will also be converted to Sheets, and some advanced features (bound Apps Script, certain charts and pivots) may not survive the conversion.&lt;/p&gt;&lt;h3 id=&quot;fix-b-apps-script-for-true-native-copies&quot;&gt;Fix B: Apps Script for true native copies&lt;/h3&gt;&lt;p&gt;Where the source account can share folders with the destination, Google Apps Script avoids conversion entirely. &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;DriveApp&lt;/code&gt;&#39;s &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;makeCopy()&lt;/code&gt; produces a genuine native copy of any file type. Share the source folder with the destination account, then run a recursive copy as the destination user:&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;function copyTree() {
  const SRC_ID = &#39;SOURCE_FOLDER_ID&#39;;
  const DST_ID = &#39;DESTINATION_FOLDER_ID&#39;;
  copyFolder_(DriveApp.getFolderById(SRC_ID), DriveApp.getFolderById(DST_ID));
}

function copyFolder_(src, dst) {
  const files = src.getFiles();
  while (files.hasNext()) {
    const f = files.next();
    const name = f.getName();
    if (!dst.getFilesByName(name).hasNext()) f.makeCopy(name, dst);
  }
  const subs = src.getFolders();
  while (subs.hasNext()) {
    const s = subs.next();
    const existing = dst.getFoldersByName(s.getName());
    const d = existing.hasNext() ? existing.next() : dst.createFolder(s.getName());
    copyFolder_(s, d);
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Because it skips files that already exist, the script is safe to re-run when it hits Apps Script&#39;s execution time limit (about 6 minutes on personal accounts, 30 on Workspace). The trade-offs: copied files get new modified dates, and files the owner has restricted from copying will fail.&lt;/p&gt;&lt;p&gt;Our rule of thumb: large file counts, or a source that blocks external sharing, go through rclone with ODS. Otherwise, Apps Script is the only option that guarantees native files.&lt;/p&gt;&lt;h2 id=&quot;a-2026-gotcha-rclones-shared-google-client-id-is-going-away&quot;&gt;A 2026 gotcha: rclone&#39;s shared Google client ID is going away&lt;/h2&gt;&lt;p&gt;If you set up rclone for Google Drive by pressing Enter at the &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;client_id&lt;/code&gt; prompt, you&#39;re using a client ID shared by every rclone user in the world. That stops working in 2026.&lt;/p&gt;&lt;p&gt;In July 2026, the rclone maintainers &lt;a href=&quot;https://forum.rclone.org/t/google-drive-and-google-photos-users-action-required/54005&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;announced&lt;/a&gt; that Google will start charging for API requests made through rclone&#39;s built-in client ID for Drive and Google Photos. Google&#39;s stated timescale is later in 2026, after 90 days&#39; notice. rclone&#39;s usage is hundreds of times over the free quota, so the project plans to disable the shared ID before charging starts and then remove it from the code (&lt;a href=&quot;https://github.com/rclone/rclone/issues/9580&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;tracking issue&lt;/a&gt;). Recent releases already print a warning when a remote uses it.&lt;/p&gt;&lt;p&gt;The exact date is still open. In mid-September the maintainer said Google had gone quiet and might be revising the plan. Don&#39;t wait for it: a migration that breaks halfway through is far worse than ten minutes of setup.&lt;/p&gt;&lt;h3 id=&quot;check-whether-youre-affected&quot;&gt;Check whether you&#39;re affected&lt;/h3&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;rclone config show dst:&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;client_id&lt;/code&gt; and &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;client_secret&lt;/code&gt; are blank or missing, the remote uses the shared ID. Remotes that use a service account are not affected. Check every Drive and Google Photos remote.&lt;/p&gt;&lt;h3 id=&quot;fix-create-your-own-client-id&quot;&gt;Fix: create your own client ID&lt;/h3&gt;&lt;p&gt;The &lt;a href=&quot;https://rclone.org/drive/#making-your-own-client-id&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;rclone Drive docs&lt;/a&gt; have the full walkthrough. In outline:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;In the Google Cloud console, create a project (any Google account works) and enable the &lt;strong&gt;Google Drive API&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Configure the OAuth consent screen: app name, support email, audience &lt;strong&gt;External&lt;/strong&gt; (or &lt;strong&gt;Internal&lt;/strong&gt; if every account involved is in one Workspace).&lt;/li&gt;&lt;li&gt;Under &lt;strong&gt;Data access&lt;/strong&gt;, add the scopes &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;auth/docs&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;auth/drive&lt;/code&gt; and &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;auth/drive.metadata.readonly&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Under &lt;strong&gt;Audience&lt;/strong&gt;, add yourself as a test user.&lt;/li&gt;&lt;li&gt;Create an OAuth client of type &lt;strong&gt;Desktop app&lt;/strong&gt; and note the client ID and secret.&lt;/li&gt;&lt;li&gt;Publish the app (External only). If &lt;strong&gt;Publish App&lt;/strong&gt; is greyed out, fill in a homepage and privacy policy URL under &lt;strong&gt;Branding&lt;/strong&gt; first.&lt;/li&gt;&lt;li&gt;Add the ID and secret to the remote with &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;rclone config&lt;/code&gt;, then run &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;rclone config reconnect dst:&lt;/code&gt; and refresh the token. Without the reconnect, rclone keeps using the old shared credentials.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;One client ID can serve all your remotes, but each remote needs its own reconnect.&lt;/p&gt;&lt;p&gt;Things that catch people out:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Unverified app warning.&lt;/strong&gt; Google shows a scary screen at sign-in. For personal use (under 100 users), you can click through it; verification isn&#39;t required.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Testing mode expires tokens after 7 days.&lt;/strong&gt; Publish the app to avoid re-authorising every week.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Unused clients can be deleted.&lt;/strong&gt; Google may remove OAuth clients inactive for six months.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Advanced Protection accounts&lt;/strong&gt; block unverified apps from requesting Drive scopes, so a self-made client ID won&#39;t work there.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A bonus:&lt;/strong&gt; your own client ID gets its own rate limit, so transfers are often noticeably faster.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;alternatives-if-you-cant-or-wont-make-a-client-id&quot;&gt;Alternatives if you can&#39;t (or won&#39;t) make a client ID&lt;/h3&gt;&lt;table style=&quot;min-width: 144px;&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Option&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Works for&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Trade-offs&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Your own OAuth client ID in rclone&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Any Google account&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;10 minutes of Cloud console setup; recommended default&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Service account with domain-wide delegation + &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;--drive-impersonate&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Workspace accounts you administer&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Ideal for the destination; can&#39;t reach consumer Gmail accounts&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Google Apps Script with &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;makeCopy()&lt;/code&gt; (Step 2, Fix B)&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Any account that can share folders&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;No OAuth client needed; time limits; resets modified dates&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Google Takeout, then upload via Drive for Desktop&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Any Google account&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;No API at all; slow, manual, Sheets arrive as &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.xlsx&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Drive for Desktop on both accounts, drag between them&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Small jobs&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Simple; native Google files sync as shortcut stubs, not content&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Workspace admin migration tools&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Workspace destination&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Built in; less control over folder layout&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;In a setup like this one, a service account could cover the Workspace destination, but the personal source accounts still need a client ID. The simplest answer is one client ID, created once and used on every remote.&lt;/p&gt;&lt;h2 id=&quot;step-3-undoing-the-dedupe-renames&quot;&gt;Step 3: Undoing the dedupe renames&lt;/h2&gt;&lt;p&gt;The failed dedupe run had left dozens of Sheets in the &lt;em&gt;source&lt;/em&gt; Drive renamed &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Name-1&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Name-2&lt;/code&gt;. There&#39;s no undo button for this. Drive&#39;s version history tracks file content, not renames, and rclone keeps no rollback log unless you saved its verbose output.&lt;/p&gt;&lt;p&gt;So we wrote one more Apps Script to rename them back in place. The important part is what it refuses to touch. A file is only renamed if all three of these are true:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It&#39;s a native Sheet, Doc or Slides file whose name ends in &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;-&amp;lt;number&amp;gt;&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;A matching real &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.xlsx&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.docx&lt;/code&gt; or &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.pptx&lt;/code&gt; with the original base name sits in the same folder.&lt;/li&gt;&lt;li&gt;No other native file of the same type already has the original name.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That way, a legitimate file called &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Budget-2&lt;/code&gt; with no Excel twin is left alone.&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;const DRY_RUN = true;  // set to false after checking the log
const EXT = {};
EXT[MimeType.GOOGLE_SHEETS] = &#39;.xlsx&#39;;
EXT[MimeType.GOOGLE_DOCS]   = &#39;.docx&#39;;
EXT[MimeType.GOOGLE_SLIDES] = &#39;.pptx&#39;;

function undoDedupe() {
  walk_(DriveApp.getFolderById(&#39;SOURCE_FOLDER_ID&#39;));
}

function walk_(folder) {
  const files = folder.getFiles();
  while (files.hasNext()) {
    const f = files.next();
    const ext = EXT[f.getMimeType()];
    if (!ext) continue;

    const m = f.getName().match(/^(.*)-\d+$/);
    if (!m) continue;
    const base = m[1];

    // Only if the real xlsx/docx/pptx twin exists
    if (!folder.getFilesByName(base + ext).hasNext()) continue;

    // Skip if a native file of the same type already has the original name
    let clash = false;
    const same = folder.getFilesByName(base);
    while (same.hasNext()) {
      if (same.next().getMimeType() === f.getMimeType()) { clash = true; break; }
    }
    if (clash) { Logger.log(&#39;SKIP (clash): &#39; + folder.getName() + &#39;/&#39; + f.getName()); continue; }

    Logger.log((DRY_RUN ? &#39;WOULD RENAME: &#39; : &#39;RENAMED: &#39;) +
               folder.getName() + &#39;/&#39; + f.getName() + &#39; -&amp;gt; &#39; + base);
    if (!DRY_RUN) f.setName(base);
  }
  const subs = folder.getFolders();
  while (subs.hasNext()) walk_(subs.next());
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Run it with &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;DRY_RUN = true&lt;/code&gt;, read the execution log, then flip it to &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;false&lt;/code&gt;. It&#39;s safe to re-run after a timeout, because files already renamed no longer match the pattern. Anything logged as &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;SKIP (clash)&lt;/code&gt; needs a human decision.&lt;/p&gt;&lt;p&gt;One detail made this whole fix possible: inside Drive, a native Sheet called &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Budget&lt;/code&gt; and a file called &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Budget.xlsx&lt;/code&gt; never actually collide. The collision only exists when a tool exports the Sheet. Restoring the original names was safe.&lt;/p&gt;&lt;h2 id=&quot;step-4-gathering-photos-and-videos-into-one-media-folder&quot;&gt;Step 4: Gathering photos and videos into one Media folder&lt;/h2&gt;&lt;p&gt;With everything in one Drive, the last request was the one the client cared about most: all photos and videos in one place, regardless of which account they came from.&lt;/p&gt;&lt;p&gt;The Drive web interface can filter by file type, but it flattens results into one long list, has no bulk move by extension, and loses track of which account and subfolder each file came from. With thousands of files, that&#39;s a non-starter.&lt;/p&gt;&lt;p&gt;Instead we used &lt;strong&gt;Google Drive for Desktop&lt;/strong&gt; on a Windows laptop and a PowerShell script run against its virtual drive. The key insight: a move &lt;em&gt;within&lt;/em&gt; the Drive for Desktop drive (for example &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;G:\&lt;/code&gt;) is sent to Google as a Drive move, not a download and re-upload, even in Stream mode. File IDs, sharing settings and version history are preserved. Only metadata changes.&lt;/p&gt;&lt;p&gt;The script works like this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It scans the account folders recursively for image and video extensions (JPEG, PNG, HEIC, camera RAW formats, MP4, MOV, MKV and so on).&lt;/li&gt;&lt;li&gt;It moves each match to &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Media\&amp;lt;AccountFolder&amp;gt;\&amp;lt;original subfolders&amp;gt;\&lt;/code&gt;, so provenance is kept and the inevitable dozens of &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;IMG_0001.jpg&lt;/code&gt; files from different phones don&#39;t collide.&lt;/li&gt;&lt;li&gt;It never overwrites. Name clashes get &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;(1)&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;(2)&lt;/code&gt; suffixes.&lt;/li&gt;&lt;li&gt;It runs as a &lt;strong&gt;dry run by default&lt;/strong&gt; and writes a CSV log of every planned move.&lt;/li&gt;&lt;li&gt;An optional switch removes folders left empty afterwards. They go to Drive&#39;s trash, so they&#39;re recoverable.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The core of it:&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;param(
    [string]$Root  = &quot;G:\My Drive\Users&quot;,
    [string]$Media = &quot;G:\My Drive\Users\Media&quot;,
    [switch]$Execute,
    [switch]$RemoveEmptyFolders
)

$ext = @(&#39;.jpg&#39;,&#39;.jpeg&#39;,&#39;.png&#39;,&#39;.gif&#39;,&#39;.heic&#39;,&#39;.heif&#39;,&#39;.webp&#39;,&#39;.tif&#39;,&#39;.tiff&#39;,
         &#39;.dng&#39;,&#39;.cr2&#39;,&#39;.nef&#39;,&#39;.arw&#39;,
         &#39;.mp4&#39;,&#39;.m4v&#39;,&#39;.mov&#39;,&#39;.avi&#39;,&#39;.mkv&#39;,&#39;.wmv&#39;,&#39;.webm&#39;,&#39;.3gp&#39;,&#39;.mts&#39;,&#39;.m2ts&#39;)

$rootFull  = (Resolve-Path -LiteralPath $Root).Path.TrimEnd(&#39;\&#39;)
$mediaFull = (Resolve-Path -LiteralPath $Media).Path.TrimEnd(&#39;\&#39;)

Get-ChildItem -LiteralPath $rootFull -Recurse -File -Force |
  Where-Object { $ext -contains $_.Extension.ToLower() -and
                 -not $_.FullName.StartsWith($mediaFull + &#39;\&#39;) } |
  ForEach-Object {
    $rel  = $_.FullName.Substring($rootFull.Length + 1)
    $dest = Join-Path $mediaFull $rel
    # ...collision handling, dry-run logging, then Move-Item when -Execute is set
  }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The workflow is: run it once as a dry run, review the CSV, then re-run with &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;-Execute&lt;/code&gt; (and &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;-RemoveEmptyFolders&lt;/code&gt; if wanted). Let the Drive for Desktop tray icon finish syncing before judging the result.&lt;/p&gt;&lt;p&gt;We deliberately left &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.svg&lt;/code&gt; and &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;.ts&lt;/code&gt; off the extension list. In a mixed archive they&#39;re far more likely to be design assets and TypeScript source than images and video.&lt;/p&gt;&lt;p&gt;For very large collections (tens of thousands of files), a server-side Apps Script avoids the local sync client entirely, at the cost of batching around the execution time limit. For a personal archive, the PowerShell route was simpler and much easier to audit.&lt;/p&gt;&lt;h2 id=&quot;lessons-learned&quot;&gt;Lessons learned&lt;/h2&gt;&lt;p&gt;Consolidating accounts is less about moving bytes and more about not breaking things along the way. A few principles carried us through:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Use the platform&#39;s own migration tools first.&lt;/strong&gt; Google&#39;s Data Migration Service handled mail with almost no effort. Scripts are for the gaps.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Native Google files are not files.&lt;/strong&gt; Any tool that copies between accounts has to export them, and that&#39;s where names collide and formats change. Know how your tool handles Sheets, Docs and Slides before you run it on real data.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Be wary of &quot;fix&quot; commands.&lt;/strong&gt; rclone&#39;s dedupe did exactly what it says, and created a second problem. Test on a small folder first.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dry run everything.&lt;/strong&gt; Every script in this project defaulted to preview mode with a log. That&#39;s what made it safe to run against years of irreplaceable photos.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Keep provenance.&lt;/strong&gt; One folder per source account, preserved all the way into the Media folder, meant we could always answer &quot;where did this come from?&quot;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Moves beat copies.&lt;/strong&gt; Within the same Drive, a move is a metadata change that preserves sharing and history. A copy creates a new file with a new date.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The end result: one Google Workspace account holding the client&#39;s mail, their documents with Sheets still working as Sheets, and every photo and video from every account in a single Media folder.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/5476707750184390573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2026/10/one-drive-to-rule-them-all.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/5476707750184390573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/5476707750184390573'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2026/10/one-drive-to-rule-them-all.html' title='One Drive to Rule Them All: Consolidating Mail, Files and Media from Many Accounts into Google Drive'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-3489266772415780324</id><published>2026-10-01T11:17:51.628+03:00</published><updated>2026-10-01T11:17:51.628+03:00</updated><title type='text'>From Password Spray to SAML: Securing Cisco FTD AnyConnect VPN with Entra ID</title><content type='html'>&lt;p&gt;&amp;nbsp;Written with the help of Claude AI&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1 data-lfile-container=&quot;d3a3cf85-d870-478e-bcb5-0303e8eccba1&quot; data-pm-slice=&quot;0 0 []&quot; id=&quot;from-password-spray-to-saml-securing-cisco-ftd-anyconnect-vpn-with-entra-id&quot;&gt;Why we did this&lt;/h1&gt;&lt;p&gt;Random Active Directory lockouts turned out to be a large password spray against our Cisco AnyConnect VPN, and the fix was moving VPN authentication to SAML with Microsoft Entra ID.&lt;/p&gt;&lt;p&gt;The starting point was common: a Cisco Firepower 1100-series firewall running FTD, managed on-box, with AnyConnect users signing in with their Windows AD password. Users kept getting locked out for no obvious reason.&lt;/p&gt;&lt;p&gt;This post walks through what we found and every step it took to fix it, including the problems we hit along the way. It&#39;s written for small IT teams who run a similar setup and are seeing the same symptoms.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What you&#39;ll end up with:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;VPN sign-in through Entra ID, with MFA on every connection&lt;/li&gt;&lt;li&gt;The firewall never sees or forwards AD passwords, so spray attempts can&#39;t lock AD accounts&lt;/li&gt;&lt;li&gt;Optional single sign-on through the user&#39;s default browser&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Starting environment:&lt;/strong&gt; FTD 7.2.x managed by Firepower Device Manager (FDM), AnyConnect 4.10, hybrid AD synced to Entra ID, no Entra ID P1 licences, and endpoint security plus a DLP agent on domain laptops.&lt;/p&gt;&lt;h2 id=&quot;step-1-prove-the-vpn-is-the-source&quot;&gt;Step 1: Prove the VPN is the source&lt;/h2&gt;&lt;p&gt;One command on the FTD settled it. Before touching anything, confirm where the failed logons come from.&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;&amp;gt; show aaa-server&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It doesn&#39;t depend on logging being set up, and it shows request, accept and reject counts per authentication server. Ours showed this for the AD server group:&lt;/p&gt;&lt;table style=&quot;min-width: 96px;&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Counter&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Value&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Authentication requests&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;~774,000&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Accepts&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;~400&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Rejects&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;~770,000&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Nearly every attempt failed, and each failure counted as a bad password against an AD account. The &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;LOCAL&lt;/code&gt; group also showed ~73,000 rejects and zero accepts. Those were attempts against the built-in default connection profiles, which authenticate against an empty local database and never reach AD.&lt;/p&gt;&lt;p&gt;Two surprises came out of this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;We weren&#39;t using RADIUS at all.&lt;/strong&gt; The server group was plain LDAP on port 389, pointing straight at a domain controller. Check your actual config rather than relying on documentation or memory.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The syslog buffer was missing everything.&lt;/strong&gt; &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;show logging | include 113005&lt;/code&gt; returned nothing despite hundreds of thousands of failures. Buffer logging was off or set below informational. If you need source IPs, enable the internal buffer at level 6 or send syslog to a server.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If the reject count is low, the VPN isn&#39;t your problem. Check event 4740 on the PDC emulator instead: the &lt;em&gt;Caller Computer Name&lt;/em&gt; points to the real source, which could be an Exchange server, a stale credential on a phone, or a cloud sign-in through Pass-through Authentication.&lt;/p&gt;&lt;h3 id=&quot;why-adding-mfa-through-nps-wouldnt-have-helped&quot;&gt;Why adding MFA through NPS wouldn&#39;t have helped&lt;/h3&gt;&lt;p&gt;The usual advice is the NPS extension for Entra MFA. That checks the AD password first and only then prompts for MFA. Every wrong guess still counts against AD, so accounts keep locking. MFA through NPS stops a guessed password from being used, but it doesn&#39;t stop the lockouts.&lt;/p&gt;&lt;p&gt;Also check the accepts. At this volume, a few weak passwords may have been guessed, so review active sessions with &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;show vpn-sessiondb anyconnect&lt;/code&gt; for unfamiliar IPs or users before going further.&lt;/p&gt;&lt;h2 id=&quot;step-2-choose-saml-and-check-what-manages-your-firewall&quot;&gt;Step 2: Choose SAML, and check what manages your firewall&lt;/h2&gt;&lt;p&gt;SAML with Entra ID was the only option that stopped the lockouts. With SAML, the firewall redirects the user to Microsoft&#39;s sign-in page and never handles the password. Entra checks it instead, and its Smart Lockout absorbs the spray. If Entra Connect uses Password Hash Sync, failed attempts never reach your domain controllers at all.&lt;/p&gt;&lt;h3 id=&quot;fdm-or-fmc&quot;&gt;FDM or FMC?&lt;/h3&gt;&lt;p&gt;We lost time following FMC instructions on a box managed by FDM. The two have different menus and different field names. A quick way to tell: FMC is a separate server or VM you log into, while FDM is the web UI served by the firewall itself. Most Firepower 1000-series boxes in small offices use FDM.&lt;/p&gt;&lt;h3 id=&quot;the-fdm-72-certificate-limitation&quot;&gt;The FDM 7.2 certificate limitation&lt;/h3&gt;&lt;p&gt;On FDM 7.2 and earlier, Cisco only supports Duo as a SAML identity provider. The IdP signing certificate must have &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Basic Constraints: CA:TRUE&lt;/code&gt;, and Entra&#39;s signing certificate doesn&#39;t. The symptom is the error &lt;strong&gt;&quot;Failed to generate SAML AuthnRequest&quot;&lt;/strong&gt;, and &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;show saml metadata &amp;lt;profile-name&amp;gt;&lt;/code&gt; returns blank sections.&lt;/p&gt;&lt;p&gt;You have two ways out:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Upgrade to FDM 7.3 or later&lt;/strong&gt;, which adds a &lt;em&gt;Skip CA Certificate Check&lt;/em&gt; option when uploading a trusted CA certificate. This is what we did.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Stay on 7.2&lt;/strong&gt; and use Cisco&#39;s workaround: generate your own signing certificate with &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;CA:TRUE&lt;/code&gt;, upload it to Entra as a PFX, make it active, and upload it to FDM. You then have to renew that certificate yourself before it expires.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The upgrade was worth doing anyway: newer releases add RA VPN threat detection and fix several actively exploited VPN vulnerabilities.&lt;/p&gt;&lt;h2 id=&quot;step-3-upgrade-ftd-and-watch-for-expired-certificates&quot;&gt;Step 3: Upgrade FTD, and watch for expired certificates&lt;/h2&gt;&lt;p&gt;We went from 7.2.5 directly to 7.6.6, which Cisco supports as a single upgrade. Check your hardware first: the Firepower 2100 series can&#39;t run 7.6 and tops out at the 7.4 train, while the 1000 series is fine.&lt;/p&gt;&lt;h3 id=&quot;before-you-start&quot;&gt;Before you start&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Take an FDM backup under &lt;strong&gt;Device → Backup and Restore&lt;/strong&gt;, and download it off the box.&lt;/li&gt;&lt;li&gt;Download the &lt;strong&gt;upgrade&lt;/strong&gt; package for your model from software.cisco.com, not the reimage package.&lt;/li&gt;&lt;li&gt;Run the readiness check in &lt;strong&gt;Device → Updates → System Upgrade&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Plan a maintenance window. A single box reboots, so internet access and the VPN go down for 45–90 minutes. Never power-cycle it mid-upgrade.&lt;/li&gt;&lt;li&gt;Go to &lt;strong&gt;Objects → Certificates&lt;/strong&gt; and look for any certificate with an expiry date in the past. The readiness check didn&#39;t catch the one that broke our upgrade.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;the-failure-we-hit&quot;&gt;The failure we hit&lt;/h3&gt;&lt;p&gt;The upgrade ran to the final stage and then failed. To find out why, check the status and the upgrade logs:&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;&amp;gt; show upgrade status detail
&amp;gt; expert
$ sudo su
# ls -lt /ngfw/var/log/sf/
# grep -iE &quot;error|fatal|fail&quot; /ngfw/var/log/sf/&amp;lt;upgrade-folder&amp;gt;/main_upgrade_script.log | tail -n 40&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The log showed &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;800_post/100_ftd_onbox_data_import.sh&lt;/code&gt; failing with &lt;em&gt;&quot;The chosen certificate has already expired.&quot;&lt;/em&gt; The new version installed fine, but re-importing the FDM configuration hit an expired certificate that 7.2 had tolerated and 7.6 rejected.&lt;/p&gt;&lt;p&gt;The culprit was &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;DefaultWebserverCertificate&lt;/code&gt;, the self-signed certificate for the FDM web UI, which had expired two years earlier. &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;show crypto ca certificates&lt;/code&gt; didn&#39;t list it, because that command only shows certificates deployed to the data plane. FDM keeps its own certificate database, and the upgrade validates all of it.&lt;/p&gt;&lt;h3 id=&quot;the-fix&quot;&gt;The fix&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Run &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;upgrade cancel&lt;/code&gt; to roll back to the old version with your configuration intact.&lt;/li&gt;&lt;li&gt;Create a new certificate under &lt;strong&gt;Objects → Certificates → Add Internal Certificate → Self-Signed&lt;/strong&gt;. You can&#39;t renew the system default.&lt;/li&gt;&lt;li&gt;Select the new certificate under &lt;strong&gt;Device → System Settings → Management Access → Management Web Server&lt;/strong&gt;. Your browser session drops and shows a certificate warning, which is expected.&lt;/li&gt;&lt;li&gt;Check the other places a certificate can be selected (RA VPN device identity, identity policy, SSL decryption), then delete any expired custom certificates.&lt;/li&gt;&lt;li&gt;Back up again and rerun the upgrade.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;step-4-configure-entra-id&quot;&gt;Step 4: Configure Entra ID&lt;/h2&gt;&lt;p&gt;The gallery app does most of the work, and you can enforce MFA without an Entra ID P1 licence. In the examples below, the VPN address is &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;vpn.example.com&lt;/code&gt; and the new connection profile is called &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;VPN-SSO&lt;/code&gt;.&lt;/p&gt;&lt;h3 id=&quot;create-a-new-connection-profile-rather-than-converting-the-old-one&quot;&gt;Create a new connection profile rather than converting the old one&lt;/h3&gt;&lt;p&gt;The connection profile name is part of both SAML URLs, so pick it once and use it everywhere with the same capitalisation. A new profile also lets you test with one user while the old one keeps working.&lt;/p&gt;&lt;h3 id=&quot;add-and-configure-the-app&quot;&gt;Add and configure the app&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;In the Entra admin center, go to &lt;strong&gt;Enterprise applications → New application&lt;/strong&gt; and add &lt;strong&gt;Cisco Secure Firewall - Secure Client&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Open &lt;strong&gt;Single sign-on&lt;/strong&gt; and choose the &lt;strong&gt;SAML&lt;/strong&gt; tile. If you don&#39;t see the SAML settings, you&#39;re probably in &lt;em&gt;App registrations&lt;/em&gt; instead of &lt;em&gt;Enterprise applications&lt;/em&gt;.&lt;/li&gt;&lt;li&gt;Under &lt;strong&gt;Basic SAML Configuration&lt;/strong&gt;, set:&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Identifier:&lt;/strong&gt; &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;https://vpn.example.com/saml/sp/metadata/VPN-SSO&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Reply URL:&lt;/strong&gt; &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;https://vpn.example.com/+CSCOE+/saml/sp/acs?tgname=VPN-SSO&lt;/code&gt;&lt;/li&gt;&lt;li&gt;If your VPN runs on a non-standard port, include it in both, for example &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;vpn.example.com:4334&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Download &lt;strong&gt;Certificate (Base64)&lt;/strong&gt;, and copy the &lt;strong&gt;Login URL&lt;/strong&gt; and &lt;strong&gt;Microsoft Entra Identifier&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Under &lt;strong&gt;Properties&lt;/strong&gt;, set &lt;strong&gt;Assignment required&lt;/strong&gt; to &lt;em&gt;Yes&lt;/em&gt;, then assign users under &lt;strong&gt;Users and groups&lt;/strong&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;without-entra-id-p1&quot;&gt;Without Entra ID P1&lt;/h3&gt;&lt;p&gt;Conditional Access needs P1, and so do a few other things you&#39;d expect to use. Here&#39;s how we worked around each:&lt;/p&gt;&lt;table style=&quot;min-width: 144px;&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Need&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;P1 approach&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;What we did without P1&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Require MFA&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Conditional Access policy&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Per-user MFA, enabled for each VPN user and every admin&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Assign users to the app&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Assign a security group&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Assign each user individually&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Lockout threshold&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Custom Smart Lockout&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Default Smart Lockout (10 failures)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;For per-user MFA, turn off Security Defaults first. Then go to &lt;strong&gt;Users → Per-user MFA&lt;/strong&gt;, enable the users, and under &lt;strong&gt;Service settings&lt;/strong&gt; untick &lt;em&gt;remember MFA on trusted devices&lt;/em&gt; so every connection prompts. Have users register the Authenticator app at &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;https://aka.ms/mfasetup&lt;/code&gt; before cutover.&lt;/p&gt;&lt;p&gt;If Entra Connect uses Pass-through Authentication instead of Password Hash Sync, failed cloud sign-ins still hit AD. Make sure your AD lockout threshold is above Entra&#39;s, or switch to Password Hash Sync.&lt;/p&gt;&lt;p&gt;P1 is worth budgeting for later. Location-based Conditional Access alone would have blocked most of this spray.&lt;/p&gt;&lt;h2 id=&quot;step-5-configure-saml-in-fdm&quot;&gt;Step 5: Configure SAML in FDM&lt;/h2&gt;&lt;p&gt;FDM needs three objects and one global setting, and the global setting is the one most guides miss.&lt;/p&gt;&lt;h3 id=&quot;1-upload-the-entra-certificate&quot;&gt;1. Upload the Entra certificate&lt;/h3&gt;&lt;p&gt;Go to &lt;strong&gt;Objects → Certificates → + → Add Trusted CA Certificate&lt;/strong&gt;. Upload the Base64 certificate and tick &lt;strong&gt;Skip CA Certificate Check&lt;/strong&gt;. The checkbox only appears when adding a new certificate, not when editing one. If it&#39;s missing after an upgrade, hard-refresh the browser, because it may be showing the old UI from cache.&lt;/p&gt;&lt;h3 id=&quot;2-create-the-saml-server-object&quot;&gt;2. Create the SAML server object&lt;/h3&gt;&lt;p&gt;Go to &lt;strong&gt;Objects → Identity Sources → + → SAML Server&lt;/strong&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;IDP Entity ID URL:&lt;/strong&gt; the Microsoft Entra Identifier, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;https://sts.windows.net/&amp;lt;tenant-id&amp;gt;/&lt;/code&gt;, including the trailing slash&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Sign In URL&lt;/strong&gt; and &lt;strong&gt;Sign Out URL:&lt;/strong&gt; the Entra Login URL, ending in &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;/saml2&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Identity Provider Certificate:&lt;/strong&gt; the certificate from step 1&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Request Signature:&lt;/strong&gt; None&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;3-set-the-fqdn-and-port&quot;&gt;3. Set the FQDN and port&lt;/h3&gt;&lt;p&gt;There is no Base URL field in FDM. FDM builds the SAML base URL from the RA VPN global settings, which live inside the connection profile wizard.&lt;/p&gt;&lt;p&gt;Edit any connection profile and click &lt;strong&gt;Next&lt;/strong&gt; until the &lt;strong&gt;Global Settings&lt;/strong&gt; page. There, &lt;strong&gt;Fully-qualified Domain Name for the Outside Interface&lt;/strong&gt; becomes the base URL, and &lt;strong&gt;Port Configuration&lt;/strong&gt; sets the VPN port.&lt;/p&gt;&lt;p&gt;We ran the VPN on 4433 because FDM management was using 443 on the outside interface. That port mismatch cost us an afternoon: the SAML login URL came out without &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;:4433&lt;/code&gt; and went nowhere. The cleanest fix is to take FDM management off the outside interface entirely under &lt;strong&gt;Device → System Settings → Management Access → Data Interfaces&lt;/strong&gt;, which you should do anyway, and run the VPN on 443.&lt;/p&gt;&lt;h3 id=&quot;4-create-the-connection-profile&quot;&gt;4. Create the connection profile&lt;/h3&gt;&lt;p&gt;Create &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;VPN-SSO&lt;/code&gt; with &lt;strong&gt;SAML&lt;/strong&gt; as the primary identity source, using your SAML object. Use the same address pool and group policy as your existing profile. Give it a group URL, and turn off the option that lets users pick a connection profile at the login page.&lt;/p&gt;&lt;h3 id=&quot;5-verify-before-testing&quot;&gt;5. Verify before testing&lt;/h3&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;&amp;gt; system support diagnostic-cli
# show running-config webvpn | include base-url
# show saml metadata VPN-SSO&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The metadata output gives you the exact SP entity ID and ACS URL the firewall uses. Copy them into Entra&#39;s Identifier and Reply URL. Matching Entra to the firewall&#39;s own output avoids typos in the port, capitalisation, or trailing slashes.&lt;/p&gt;&lt;p&gt;If something fails, run &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;debug webvpn saml 255&lt;/code&gt;, retry from the client, and read the output. Run &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;undebug all&lt;/code&gt; when you&#39;re done.&lt;/p&gt;&lt;h2 id=&quot;step-6-fix-the-client-side-problems&quot;&gt;Step 6: Fix the client-side problems&lt;/h2&gt;&lt;p&gt;Once the firewall and Entra matched, SAML worked from a phone and a personal PC but failed on domain laptops. Both problems were on the endpoint, not the firewall.&lt;/p&gt;&lt;h3 id=&quot;profile-settings-mandate-a-single-local-user&quot;&gt;&quot;Profile settings mandate a single local user&quot;&lt;/h3&gt;&lt;p&gt;This appeared after a successful MFA approval. The client profile&#39;s &lt;strong&gt;Windows Logon Enforcement&lt;/strong&gt; was set to &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;SingleLocalLogon&lt;/code&gt;, and the test PC had a second Windows session still signed in. Run &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;query user&lt;/code&gt;, sign off the extra session, and connect again. Keep the setting: it stops a second user on the same PC from riding someone else&#39;s tunnel.&lt;/p&gt;&lt;h3 id=&quot;sent-an-invalid-response-then-validation-failed&quot;&gt;&quot;Sent an invalid response&quot;, then &quot;validation failed&quot;&lt;/h3&gt;&lt;p&gt;On domain laptops, the embedded browser showed a TLS error. Refreshing loaded the Microsoft sign-in page and MFA succeeded, but the client then reported validation failed. The firewall debug showed:&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;%FTD-3-716164: SAML response relay state missing data integrity hash.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The firewall signs the RelayState it sends to Entra and expects that signature back. Refreshing after the TLS error started a sign-in without the firewall&#39;s RelayState, so the firewall rejected the result. The refresh was a symptom; the TLS error was the real problem.&lt;/p&gt;&lt;h3 id=&quot;finding-the-tls-interception&quot;&gt;Finding the TLS interception&lt;/h3&gt;&lt;p&gt;Opening the Microsoft sign-in page in Edge on the laptop and checking the certificate showed the cause. The certificate chain led to a root named after the laptop&#39;s own hostname, ending in &quot;endpoint cert&quot;, not to a Microsoft or DigiCert root.&lt;/p&gt;&lt;p&gt;That pattern means local software is intercepting HTTPS by re-signing it with its own root certificate. Things we learned while tracking it down:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Pausing the antivirus didn&#39;t help&lt;/strong&gt;, because it wasn&#39;t the antivirus. The interceptor was the &lt;strong&gt;DLP agent&lt;/strong&gt;, which generates a signing certificate for each endpoint. ESET&#39;s own certificate, for comparison, is named &quot;ESET SSL Filter CA&quot;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The certificate&#39;s NotBefore date was useless&lt;/strong&gt;, because interception products often backdate it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Check another laptop.&lt;/strong&gt; If every managed laptop has the same pattern, it&#39;s your own software. If only one does, treat that laptop as potentially compromised: it can read Microsoft sign-ins in cleartext.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;the-fix-exclusions-in-the-interception-tool&quot;&gt;The fix: exclusions in the interception tool&lt;/h3&gt;&lt;p&gt;SAML doesn&#39;t tolerate a man-in-the-middle, so the exclusions are required. In the DLP console&#39;s protection exclusions (website exclusions), we added:&lt;/p&gt;&lt;pre autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;&lt;code&gt;vpn.example.com, login.microsoftonline.com, *.microsoftonline.com, login.live.com, *.msauth.net, *.msftauth.net&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After the policy synced and the client restarted, the certificate chain went back to Microsoft&#39;s and the VPN connected normally. If your interceptor is an antivirus or a secure web gateway agent, the equivalent setting is usually called SSL/TLS filtering exclusions.&lt;/p&gt;&lt;h2 id=&quot;step-7-add-single-sign-on-and-upgrade-the-client&quot;&gt;Step 7: Add single sign-on and upgrade the client&lt;/h2&gt;&lt;p&gt;Switching the SAML login to the user&#39;s default browser gives SSO, so users who are already signed in to Microsoft don&#39;t type their password again.&lt;/p&gt;&lt;h3 id=&quot;enable-sso&quot;&gt;Enable SSO&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;In the &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;VPN-SSO&lt;/code&gt; connection profile, change the &lt;strong&gt;SAML Login Experience&lt;/strong&gt; from the embedded browser to &lt;strong&gt;Default OS Browser&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;In the SAML server object, untick &lt;strong&gt;Request IDP re-authentication at login&lt;/strong&gt;. While it&#39;s ticked, Entra has to ask for the password every time.&lt;/li&gt;&lt;li&gt;Deploy, then test with a fresh connection.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;You probably don&#39;t need the separate &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;external-sso-*.pkg&lt;/code&gt; package. It was only required by early AnyConnect 4.10 builds; current clients include the support. It&#39;s a 10 KB download, so keep it on hand in case FDM asks for it.&lt;/p&gt;&lt;p&gt;With per-user MFA, expect no password prompt but still an Authenticator prompt. The Windows token only satisfies MFA if the user signed in with Windows Hello for Business. For a firm that just survived a spray, keeping that tap is a reasonable trade-off. Running &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;dsregcmd /status&lt;/code&gt; tells you whether laptops are hybrid-joined (&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;AzureAdJoined: YES&lt;/code&gt;, &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;AzureAdPrt: YES&lt;/code&gt;), which gives the most reliable SSO.&lt;/p&gt;&lt;h3 id=&quot;upgrade-anyconnect-410-to-secure-client-51&quot;&gt;Upgrade AnyConnect 4.10 to Secure Client 5.1&lt;/h3&gt;&lt;p&gt;AnyConnect 4.x is end of life. From the Secure Client 5 downloads, take:&lt;/p&gt;&lt;table style=&quot;min-width: 96px;&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Package&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Use&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Headend Deployment Package (Windows), &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;*-webdeploy-k9.pkg&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Upload to FDM; clients upgrade from it&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Pre-Deployment Package (Windows), &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;*-predeploy-k9.zip&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Install the core VPN MSI on one test laptop first&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Profile Editor (Windows)&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Edit client profile XML&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Skip the ARM64 packages unless you have ARM laptops, and skip the API and transforms packages.&lt;/p&gt;&lt;p&gt;In FDM, the client package is uploaded on the &lt;strong&gt;Global Settings&lt;/strong&gt; page of the connection profile wizard. FDM holds one package per operating system, so the upload button stays greyed out until you remove the old Windows package with its &lt;strong&gt;X&lt;/strong&gt;. Remove and upload in the same session, then deploy.&lt;/p&gt;&lt;p&gt;Clients upgrade themselves on their next connection, without local admin rights. Afterwards, update any application exclusions in your security tools: the install path changes to &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;Cisco Secure Client&lt;/code&gt;, and the UI process is now &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;csc_ui.exe&lt;/code&gt;.&lt;/p&gt;&lt;h2 id=&quot;step-8-close-the-old-attack-path&quot;&gt;Step 8: Close the old attack path&lt;/h2&gt;&lt;p&gt;SAML only ends the lockouts once nothing else on the firewall still sends passwords to AD.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Delete the LDAP-backed connection profile&lt;/strong&gt; after all users have moved. As long as it exists, attackers keep spraying AD through it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Keep the default profiles as sinkholes.&lt;/strong&gt; &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;DefaultWEBVPNGroup&lt;/code&gt; and &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;DefaultRAGroup&lt;/code&gt; should authenticate against something that can never succeed, such as an empty local database. FDM 7.6.4 and later fixed a bug that prevented changing these in FDM.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Turn off connection profile selection&lt;/strong&gt; on the login page, and don&#39;t use aliases. Users reach the SAML profile only through its group URL in the client profile.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Watch the counters.&lt;/strong&gt; Run &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;show aaa-server&lt;/code&gt; over the next day. The LDAP reject count should stop climbing. If it keeps rising, something still points at the LDAP server.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Enable RA VPN threat detection.&lt;/strong&gt; It&#39;s available from 7.4.2.1 and 7.6.0, and it shuns IP addresses that repeatedly fail authentication or probe the default profiles. Check with &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;show threat-detection service&lt;/code&gt; and &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;show shun&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;housekeeping&quot;&gt;Housekeeping&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Send syslog to an external server or SIEM, so the next incident has a record.&lt;/li&gt;&lt;li&gt;Switch any remaining LDAP use to LDAPS. Plain LDAP on 389 sends passwords to the domain controller unencrypted.&lt;/li&gt;&lt;li&gt;Keep FDM management off the internet.&lt;/li&gt;&lt;li&gt;Put certificate expiry dates in a calendar: the VPN certificate, the Entra SAML signing certificate (three years by default), and the FDM web certificate.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;lessons-learned&quot;&gt;Lessons learned&lt;/h2&gt;&lt;p&gt;Most of our time went into problems that a short checklist would have caught up front.&lt;/p&gt;&lt;table style=&quot;min-width: 144px;&quot;&gt;&lt;colgroup&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;col style=&quot;min-width: 48px;&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Symptom&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Cause&lt;/p&gt;&lt;/th&gt;&lt;th colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Fix&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Random AD lockouts&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Password spray through VPN, LDAP auth straight to a DC&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;SAML with Entra ID; delete the LDAP profile&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&quot;Failed to generate SAML AuthnRequest&quot;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;FDM 7.2 rejects Entra&#39;s non-CA signing certificate&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Upgrade to 7.3+ and use Skip CA Check&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;SAML login URL missing the port&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;FDM builds the base URL from the outside-interface FQDN&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Run VPN on 443 or include the port in the FQDN&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Upgrade fails at &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;800_post&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Expired &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;DefaultWebserverCertificate&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Replace it before upgrading&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;&quot;Single local user&quot; error&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Second Windows session signed in&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Sign off the extra session&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;TLS error, then relay state 716164&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;DLP agent intercepting HTTPS&lt;/p&gt;&lt;/td&gt;&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p&gt;Exclude VPN and Microsoft sign-in domains&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;pre-flight-checklist&quot;&gt;Pre-flight checklist&lt;/h3&gt;&lt;ul data-kind=&quot;check&quot;&gt;&lt;li data-checked=&quot;false&quot;&gt;&lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;show aaa-server&lt;/code&gt; confirms whether the VPN is the lockout source&lt;/li&gt;&lt;li data-checked=&quot;false&quot;&gt;Confirm whether FTD is managed by FDM or FMC, and which version&lt;/li&gt;&lt;li data-checked=&quot;false&quot;&gt;No expired certificates under &lt;strong&gt;Objects → Certificates&lt;/strong&gt;&lt;/li&gt;&lt;li data-checked=&quot;false&quot;&gt;FDM backup downloaded off the box&lt;/li&gt;&lt;li data-checked=&quot;false&quot;&gt;Users registered for MFA before cutover&lt;/li&gt;&lt;li data-checked=&quot;false&quot;&gt;Certificate issuer for &lt;code autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; spellcheck=&quot;false&quot;&gt;login.microsoftonline.com&lt;/code&gt; checked on a managed laptop&lt;/li&gt;&lt;li data-checked=&quot;false&quot;&gt;New connection profile tested with one user before moving everyone&lt;/li&gt;&lt;li data-checked=&quot;false&quot;&gt;Old LDAP profile deleted after cutover&lt;/li&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/3489266772415780324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2026/10/from-password-spray-to-saml-securing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/3489266772415780324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/3489266772415780324'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2026/10/from-password-spray-to-saml-securing.html' title='From Password Spray to SAML: Securing Cisco FTD AnyConnect VPN with Entra ID'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-9068097978439506612</id><published>2025-02-20T14:47:00.001+03:00</published><updated>2025-02-20T14:47:51.405+03:00</updated><title type='text'>Microsoft 365 emails to Gmail getting blocked with 550 5.7.1 errors</title><content type='html'>&lt;p&gt;&amp;nbsp;We are using Microsoft 365 for their email service and recently faced an issue where outgoing emails to Gmail were not getting delivered because of the following error :&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style=&quot;font-family: &amp;quot;Segoe UI&amp;quot;,sans-serif; font-size: 10.5pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;&quot;&gt;550 5.7.350 Remote
server returned message detected as spam -&amp;gt; 550 5.7.1 [2a01:111:f403:c40f::7
19] Gmail has detected that this message;is likely suspicious due to the very
low reputation of the sending;domain. To best protect our users from spam, the
message has been;blocked. For more information, go to; &lt;a href=&quot;https://support.google.com/mail/answer/188131&quot;&gt;&lt;span style=&quot;font-style: normal;&quot;&gt;https://support.google.com/mail/answer/188131&lt;/span&gt;&lt;/a&gt;
d9443c01a7336-220d5320c49si112823045ad.160 - gsmtp&lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;font-family: &amp;quot;Segoe UI&amp;quot;,sans-serif; font-size: 10.5pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style=&quot;font-family: &amp;quot;Segoe UI&amp;quot;,sans-serif; font-size: 10.5pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Now unless you have some kind of gold-star support with either Microsoft or Gmail, you are stuck with combing through documentation and forums to understand where to even start troubleshooting this error. The usual steps of checking if the domain is listed on spam sites (MultiRBL) and if TestExchangeConnectivity didnt give much insight into the error. &lt;br /&gt;&lt;br /&gt;&lt;p&gt;After an hour of going through various forum posts, there was a set of posts with a workaround for a similar situation of emails being sent from Microsoft 365 servers.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;The issue that was identified was that Gmail was blocking emails sent to their servers from IPV6 addresses which were used by Microsoft, as these IPs were not listed on the SPF record of the domain sending the email.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;Now Microsoft documentation recommends to add &quot;include:spf.protection.outlook.com&quot; to the domain SPF record. And technically it &quot;should&quot; resolve to all the outgoing IPs of Microsoft . But I assume in this case the IPv6 server IPs are not resolved here, and so it gets blocked&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;The rule was to filter emails sent to gmail.com or *.gmail.com and the option to select was the MX record option. The idea here was that DNS resolution using the MX record would force resolution in IPV4 and everything will go well.&amp;nbsp;&lt;br /&gt;So I setup the rule, and the connector allows for validation, which also worked.&amp;nbsp;&lt;br /&gt;Great!&amp;nbsp;&lt;br /&gt;Not really.&amp;nbsp;&lt;br /&gt;The next day, the problem started again. And this time the connector validation was also failing.&amp;nbsp;&lt;br /&gt;After some more digging around,&amp;nbsp; someone figured out a brute force way of updating the SPF record with&amp;nbsp;+ip6:2603:1000::/24&amp;nbsp; which sort of blanket whitelists the Microsoft IPV6 range.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;The connector validated successfully after this. And outgoing mails to Gmail started working again!&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Now we wait and see what Gmail does next :)&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/9068097978439506612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2025/02/microsoft-365-emails-to-gmail-getting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/9068097978439506612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/9068097978439506612'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2025/02/microsoft-365-emails-to-gmail-getting.html' title='Microsoft 365 emails to Gmail getting blocked with 550 5.7.1 errors'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-385561970763086794</id><published>2024-09-04T14:49:00.004+03:00</published><updated>2024-09-04T15:19:32.674+03:00</updated><title type='text'>Fortigate SDWAN with IPSec Site-to-Site VPN and multiple subnets at both sites</title><content type='html'>&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;Recently, I was tasked with setting up a Site-to-Site VPN between a Fortigate FG100-F in a High Availability (HA) configuration and a FG60-F. Both sites featured dual WAN links configured in an SD-WAN setup, along with multiple VLANs.&lt;br /&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;I needed to setup multiple VLANs at the branch office Fortigate. I used the VLAN switch feature to create VLANs as sub-interfaces, and then added them to a zone to help with inter-vlan traffic, and for easier firewall policy configuration&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&lt;br /&gt;To completed the site-to-site VPN links despite consulting the Fortigate documentation, I couldn&#39;t find an example that exactly matched this scenario.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;After some extensive searching, I found a YouTube video that demonstrated this particular setup. You can watch it &lt;a href=&quot;https://www.youtube.com/watch?v=bV5RakywHyA&quot; rel=&quot;noopener&quot; target=&quot;_new&quot;&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;YouTube Video Summary&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;The video, although in Spanish, provides a detailed walkthrough of setting up a Site-to-Site VPN between Fortigate devices in a similar environment. It covers the configuration of dual WAN links, SD-WAN, . Thanks to YouTube&#39;s caption feature, I was able to follow along and apply the configurations needed for my setup.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&amp;nbsp;The video demonstrates how to combine IPsec tunnels with SD-WAN to balance traffic across multiple internet providers. It includes configuring two IPsec tunnels between SP1 and SP2 interfaces of two Fortigates and setting up SD-WAN to use these Fortigates for health checks.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&lt;b&gt;Network Configuration&lt;/b&gt;:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&lt;b&gt;Interface Configuration&lt;/b&gt;: Assign &lt;code&gt;ISP1&lt;/code&gt; and &lt;code&gt;ISP2&lt;/code&gt; to the &quot;wan internet&quot; zone with their respective gateways.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&lt;b&gt;Routing and Policy Setup&lt;/b&gt;: A default route and an internet policy are created for outgoing traffic on LAN &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&lt;b&gt;IPsec Tunnel Configuration&lt;/b&gt;:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;Two IPsec tunnels are configured between the Fortigates with identical settings.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;SD-WAN zones are created, and the tunnels are added to these zones.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&lt;b&gt;Loopback Interface and Static Routing&lt;/b&gt;:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;Create a loopback interface on both Fortigates for monitoring.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;Set up static routes using these interfaces.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&lt;b&gt;Policy Configuration and SD-WAN Optimization&lt;/b&gt;:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;Policies are created to route traffic based on the loopback interface.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;SD-WAN rules are configured to route traffic through specific IPsec tunnels based on latency.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;The video demonstrates how latency can trigger a switch between tunnels.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;This video is an excellent resource for setting up IPsec with SD-WAN on Fortigate devices, especially in scenarios requiring dynamic traffic management based on link performance.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;For more details, you can watch the video &lt;a href=&quot;https://www.youtube.com/watch?v=XXb1oAv1S-c&quot; rel=&quot;noopener&quot; target=&quot;_new&quot;&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;Troubleshooting the Ping Issue&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;One problem I encountered was that after bringing the VPN links up ,ping was working from the Branch to the HQ, it wasn&#39;t working the other way around. To diagnose this, I used the following Fortigate CLI commands:&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;flex items-center relative text-token-text-secondary bg-token-main-surface-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md&quot;&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center relative text-token-text-secondary bg-token-main-surface-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md&quot;&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;div class=&quot;dark bg-gray-950 contain-inline-size rounded-md border-[0.5px] border-token-border-medium&quot;&gt;&lt;div class=&quot;flex items-center relative text-token-text-secondary bg-token-main-surface-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md&quot;&gt;di de reset&lt;br /&gt;diagnose debug flow filter addr &amp;lt;src-addr&amp;gt;&lt;br /&gt;di de flow filter proto 1&lt;br /&gt;diagnose debug flow show function enable&lt;br /&gt;diagnose debug console timestamp enable&lt;br /&gt;diagnose debug flow show iprope enable&lt;br /&gt;diagnose debug flow trace start 30&lt;br /&gt;diagnose debug enable&lt;/div&gt;&lt;div class=&quot;flex items-center relative text-token-text-secondary bg-token-main-surface-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center relative text-token-text-secondary bg-token-main-surface-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md&quot;&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center relative text-token-text-secondary bg-token-main-surface-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md&quot; style=&quot;text-align: justify;&quot;&gt;&lt;div class=&quot;flex max-w-full flex-col flex-grow&quot;&gt;&lt;div class=&quot;min-h-[20px] text-message flex w-full flex-col items-end gap-2 break-words [.text-message+&amp;amp;]:mt-5 overflow-x-auto whitespace-normal&quot; data-message-author-role=&quot;assistant&quot; data-message-id=&quot;1a184020-c8ba-4279-913e-69629fce2bfb&quot; dir=&quot;auto&quot;&gt;&lt;div class=&quot;flex w-full flex-col gap-1 empty:hidden first:pt-[3px]&quot;&gt;&lt;div class=&quot;markdown prose w-full break-words dark:prose-invert light&quot;&gt;&lt;pre&gt;&lt;div class=&quot;flex items-center relative text-token-text-secondary bg-token-main-surface-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md&quot;&gt;&lt;div class=&quot;flex max-w-full flex-col flex-grow&quot;&gt;&lt;div class=&quot;min-h-[20px] text-message flex w-full flex-col items-end gap-2 break-words [.text-message+&amp;amp;]:mt-5 overflow-x-auto whitespace-normal&quot; data-message-author-role=&quot;assistant&quot; data-message-id=&quot;1a184020-c8ba-4279-913e-69629fce2bfb&quot; dir=&quot;auto&quot;&gt;&lt;div class=&quot;flex w-full flex-col gap-1 empty:hidden first:pt-[3px]&quot;&gt;&lt;div class=&quot;markdown prose w-full break-words dark:prose-invert light&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;The issue was traced back to the SD-WAN policy rules at the HQ. The policy&amp;nbsp;was configured to&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;route all traffic through the WAN links, completely bypassing the VPN interfaces. I had to modify&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&amp;nbsp;the policy to include more specific destinations, which allowed outgoing VPN traffic to be routed&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&amp;nbsp;correctly through the VPN interfaces.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;This setup, while challenging, was a great learning experience, and the YouTube video was&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;instrumental in helping me navigate the configuration process.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/385561970763086794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2024/09/fortigate-sdwan-with-ipsec-site-to-site.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/385561970763086794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/385561970763086794'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2024/09/fortigate-sdwan-with-ipsec-site-to-site.html' title='Fortigate SDWAN with IPSec Site-to-Site VPN and multiple subnets at both sites'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-2866003698459709977</id><published>2024-08-05T11:39:00.002+03:00</published><updated>2024-08-06T10:47:57.357+03:00</updated><title type='text'>Handling PDF Size Issues with Protected Files: A Solution Using Microsoft PDF Printer</title><content type='html'>&lt;p&gt;In a recent project, I encountered a challenge involving a protected PDF file that needed to be included in a multi-page document. The PDF file was around 100 KB, and due to file upload limitations, the entire document had to be under 2 MB. Unfortunately, the protection settings of the PDF prevented it from being added to the multi-page document, citing security restrictions. Additionally, Adobe&#39;s PDF printer does not allow printing protected PDFs to a new PDF file—quite a limitation from Adobe!&lt;/p&gt;&lt;p&gt;To work around this, I used the Microsoft PDF Printer, which allowed me to save the file as an unprotected PDF. However, this resulted in a significant increase in file size, ballooning to around 3 MB. Despite attempting various methods to reduce the size, such as using &quot;Optimize PDF,&quot; &quot;Reduce PDF Size,&quot; and online compression tools, the results were minimal.&lt;/p&gt;&lt;p&gt;After further research, I stumbled upon a forum suggestion to use the &quot;Print As Image&quot; option in the Advanced settings of the Microsoft PDF Printer. This setting effectively reduced the file size to less than 500 KB, well within the required limit.&lt;/p&gt;&lt;p&gt;This technique can be a valuable solution for anyone facing similar issues with protected PDF files and file size constraints.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/2866003698459709977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2024/08/adobe-print-to-pdf-size-issue.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/2866003698459709977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/2866003698459709977'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2024/08/adobe-print-to-pdf-size-issue.html' title='Handling PDF Size Issues with Protected Files: A Solution Using Microsoft PDF Printer'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-3248997003597124951</id><published>2019-08-28T10:43:00.004+03:00</published><updated>2019-08-28T10:43:58.363+03:00</updated><title type='text'>Adobe Acrobat DC Fill &amp; sign Tool missing</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Acrobat DC has a nifty tool to allow placing of saved signatures on documents.&lt;br /&gt;
After a recent laptop replacement, one user couldnt find the tool to place the signatures needed.&lt;br /&gt;
The issue came out to be that Acrobat removes the tool if the language setting of the applications is not set as English only. The application here was set to English &amp;amp; Arabic&lt;br /&gt;
You have to go to Edit-&amp;gt;Preferences-&amp;gt;Language&lt;br /&gt;
The Application Language option should be set as English Only&lt;br /&gt;
After restarting the program, the Fill&amp;amp;sign option appeared in the Tools Section&lt;br /&gt;
&lt;br /&gt;
Ref: https://forums.adobe.com/thread/1945290&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/3248997003597124951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2019/08/adobe-acrobat-dc-fill-sign-tool-missing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/3248997003597124951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/3248997003597124951'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2019/08/adobe-acrobat-dc-fill-sign-tool-missing.html' title='Adobe Acrobat DC Fill &amp; sign Tool missing'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-5022787113117673437</id><published>2019-03-18T14:01:00.000+03:00</published><updated>2019-03-18T14:01:20.810+03:00</updated><title type='text'>Renew expired Microsoft Exchange Server Auth Certificate</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Today our Exchange servers refused to send out emails to the user mailboxes. After going through the logs, Warnings popped up for Exchange OAuth, which said that SMTPReceive connector was failing because of a certificate issue.&lt;br /&gt;
&lt;br /&gt;
So Exchange server installs a server authentication certificate used for Organizational Authentication for itself and other Exchange servers in the organization for intra-site communication, during initial setup&lt;br /&gt;
&lt;br /&gt;
Usually these certificates have a 5 year validity. Upon expiry, some services start failing to work as needed.&lt;br /&gt;
&lt;br /&gt;
Following the link and steps below, i was able to get&amp;nbsp; the services up and running again.&lt;br /&gt;
&lt;br /&gt;
ref: https://community.spiceworks.com/topic/512374-missing-the-microsoft-exchange-server-auth-certificate &lt;br /&gt;
&lt;br /&gt;
New-ExchangeCertificate -KeySize 2048 -PrivateKeyExportable $true 
-SubjectName &quot;cn= Microsoft Exchange Server Auth Certificate&quot; 
-DomainName &quot;*.yourdomain.com&quot; -FriendlyName &quot;Microsoft Exchange Server 
Auth Certificate&quot; -Services smtp

&lt;br /&gt;
Do not accept to replace the SMTP certificate when prompted&lt;br /&gt;


2. Note the thumbprint of the new certificate. Let us assume it is 7A39541F8DF58D4821967DD8F899B27410F7C081&lt;br /&gt;


3. $a=get-date&lt;br /&gt;


4. Set-AuthConfig -NewCertificateThumbprint 7A39541F8DF58D4821967DD8F899B27410F7C081 –NewCertificateEffectiveDate $a&lt;br /&gt;


Accept to continue despite the fact that the certificate effective date is not 48 hours into the future&lt;br /&gt;


5. Set-AuthConfig –PublishCertificate&lt;br /&gt;
















&lt;br /&gt;

6. Make sure to remove any potential reference to the previous 
certificate (which might not exist anymore) by doing Set-AuthConfig 
-ClearPreviousCertificate.﻿&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/5022787113117673437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2019/03/renew-expired-microsoft-exchange-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/5022787113117673437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/5022787113117673437'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2019/03/renew-expired-microsoft-exchange-server.html' title='Renew expired Microsoft Exchange Server Auth Certificate'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-6766376867040441564</id><published>2019-03-18T13:56:00.003+03:00</published><updated>2019-03-18T13:56:49.473+03:00</updated><title type='text'>Access Denied Error on Exchange Management Shell for Exchange 2013</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
So I tried opening the EMS tool on our Exchange server and i was getting the dreaded Access Denied error. I was also unable to open the Exchange Toolbox.&lt;br /&gt;
&lt;br /&gt;
First issue i noticed was that the server time was off by 6 minutes. So I got that fixed first.&lt;br /&gt;
&lt;br /&gt;
w32tm is the utility used for that.&lt;br /&gt;
&lt;br /&gt;
But that didnt help with the original error &lt;br /&gt;
&lt;br /&gt;
After having enough of going through the logs for errors, and getting fed up of googling, i came across a forum which talked about two modules used by IIS to support authentication on the Powershell Folders under the Default WebSite, and the Exchange Back-End Site&lt;br /&gt;
&lt;br /&gt;
1. WSMAN&lt;br /&gt;
2. KERBAUTH&lt;br /&gt;
&lt;br /&gt;
So I left KERBAUTH module on for the Powershell Folder under Default Website and removed WSMAN module from there.&lt;br /&gt;
I enable KERBAUTH and WSMAN for the Powershell folder under Exchange Back-End&lt;br /&gt;
&lt;br /&gt;
Both modules have to be native and local when enabled. You can find them under the Configure Native Modules setting on the right side pane&lt;br /&gt;
&lt;br /&gt;
Its better to run iisreset after any change to the IIS settings to be sure of the effects of your changes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After setting this combo, both EMS and Toolbox started working.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/6766376867040441564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2019/03/access-denied-error-on-exchange.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/6766376867040441564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/6766376867040441564'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2019/03/access-denied-error-on-exchange.html' title='Access Denied Error on Exchange Management Shell for Exchange 2013'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-3328644426273284776</id><published>2019-02-26T11:31:00.001+03:00</published><updated>2019-02-26T11:33:30.862+03:00</updated><title type='text'>QuickParts button in Word 2013</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I got to know about a nice feature in Word while looking to solve a problem for a office user.&lt;br /&gt;
The user wanted to include customized header and footers so that they could be selected from the header drop down list&lt;br /&gt;
&lt;br /&gt;
The Quickparts button is available under the Insert Tab .&lt;br /&gt;
&lt;br /&gt;
Select the content that you want to replicate later. Click the QuickParts button, choose Save to Quick Part gallery.&lt;br /&gt;
&lt;br /&gt;
Then the building blocks menu comes up, and you can change the Gallery to which it is saved. Choose the Headers Gallery, and give the selection a name to be referenced to later.&lt;br /&gt;
&lt;br /&gt;
Once saved, the selection will be available for all future documents. This however requires you to save these changes to a file called BuildingBlocks.dotx, which Word will ask for when closing the program.&lt;br /&gt;
&lt;br /&gt;
The new custom header will now be available under the Headers drop down menu.&lt;br /&gt;
&lt;br /&gt;
Even footers and tables can be customized in a similar manner.&lt;br /&gt;
&lt;br /&gt;
For further info, please have a look at this link from TechRepublic.&lt;br /&gt;
https://www.techrepublic.com/article/office-q-a-adding-custom-headers-to-words-headers-gallery/&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/3328644426273284776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2019/02/quickparts-button-in-word-2013.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/3328644426273284776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/3328644426273284776'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2019/02/quickparts-button-in-word-2013.html' title='QuickParts button in Word 2013'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-7885483914871320848</id><published>2011-08-18T11:55:00.000+03:00</published><updated>2011-08-18T11:55:19.067+03:00</updated><title type='text'>Cisco 881 with Thomson Speedtouch ADSL</title><content type='html'>The requirement was to have the Cisco 881 WAN port control the PPPOE connection, and have it&#39;s IP as the external IP of the connection. The Cisco 881 however does not have an analog telephone port so as to directly dial the connection. The CPE here that was provided was an Thomson Speedtouch ADSL router. The Cisco WAN port is connected to one of the Thomson ethernet ports. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the PPPOE connection is configured on the Speedtouch as well as the Cisco 881, then there will be a fight between the two, to control the connection, the result being that the connection will keep dropping, expecting one of the two to dial. &lt;br /&gt;
&lt;br /&gt;
What needs to be done is to setup the Thomson Speedtouch as a bridge, using the Easy Setup wizard on its web interface. This way, the only router that will dial the connection is the Cisco router and hence will receive the external IP of the ADSL connection on its WAN interface.</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/7885483914871320848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2011/08/cisco-881-with-thomson-speedtouch-adsl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/7885483914871320848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/7885483914871320848'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2011/08/cisco-881-with-thomson-speedtouch-adsl.html' title='Cisco 881 with Thomson Speedtouch ADSL'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-8978161196985372484</id><published>2011-08-18T11:44:00.000+03:00</published><updated>2011-08-18T11:44:30.353+03:00</updated><title type='text'>Fujitsu-SAN!</title><content type='html'>I got an opportunity to setup a Fujitsu Eternux DX 80 Storage with a Fujitsu RX 200 server. Once the storage was out of the box, it was just a matter of putting up the railings and slowly placing the storage onto the grooves. Since the hard disks come pre-configured, there was no need to install them separately. I connected a laptop to the MNT port for configuration and setup an IP in the default IP range of the MNT port ( 192.168.1.1). Logged on to the web-interface using the default u/p combo (root/root). Setting up the RAID config and the volumes was quite easy, thanks to the detailed but well thought-of setup wizard. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now the MNT port is used only for management through a direct connection to a device like server/desktop/laptop and cannot be connected to a switch. For that there is a RMT port which can be setup for remote configuration. Also , the MNT and RMT ports can&#39;t be on the same subnet.&lt;br /&gt;
trust me, I tried!&lt;br /&gt;
&lt;br /&gt;
Now comes the part of setting up the volumes so that the server can see them. This setting is know as host affinity where we can set up the volumes in such a way that they can be &#39;reserved&#39; for certain hosts. Very useful in the case of when the storage is connected to a fibre switch. This is done by using the feature of the fibre card known as WWN or World-Wide Name. This basically identifies the fibre card installed on the server to which the volume has to be associated to. &lt;br /&gt;
&lt;br /&gt;
Once the volumes are setup , we needed to wait until the formatting is done.This took a while because one volume was 4TB and the other was 2TB. I tried setting up the server to recognize the volumes but it wouldn&#39;t show up. The formatting took a while to complete. Im not sure how long because I came back the next day to check, and it was done. &lt;br /&gt;
&lt;br /&gt;
My first misconception was that the Storage volumes would show up during the HBA scan that usually happens when the server starts up. But after a little bit of reading, I found out that only certain fibre cards support this feature whereby you can actually boot from a SAN!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So in this case, the server OS had to load the drivers for the Fibre card , only after which the volumes could be detected. This server was running Ubuntu Server 11.04, so drivers wouldn&#39;t really be a problem. &lt;br /&gt;
&lt;br /&gt;
Once the host affinity was configured and the volumes had completed formatting, the volumes showed up under devices folder on the server.&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/8978161196985372484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2011/08/fujitsu-san.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/8978161196985372484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/8978161196985372484'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2011/08/fujitsu-san.html' title='Fujitsu-SAN!'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-5382217275166361521</id><published>2011-02-16T14:53:00.000+03:00</published><updated>2011-02-16T14:53:30.843+03:00</updated><title type='text'>Shazam!</title><content type='html'>My brother bought a Nokia X3-02 recently, and he was going through the Nokia Ovi Store, and found an interesting app,called Shazam (www.shazam.com) they&#39;ve got apps for mobiles and the pc. it&#39;s an online service, which can by listening to any song clip or part of a song, identify it and give you the song details.&lt;br /&gt;
&lt;br /&gt;
The wiki article http://en.wikipedia.org/wiki/Shazam_(service) makes for interesting reading. Apparently there&#39;s something known as acoustic fingerprints for audio files.</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/5382217275166361521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2011/02/shazam.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/5382217275166361521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/5382217275166361521'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2011/02/shazam.html' title='Shazam!'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-8641397846774003110</id><published>2011-02-16T11:37:00.001+03:00</published><updated>2011-02-16T11:37:22.220+03:00</updated><title type='text'>Cisco 887 and VPN</title><content type='html'>I&#39;m setting up a Cisco 887 ISR where the internet facing interface is ADSL and this router is the main router for the LAN &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Configure the Easy VPN server using Cisco Configuration Professional&lt;br /&gt;
1.Create a Loopback interface with IP address 10.10.10.10&lt;br /&gt;
2. Configure a Group Name along with a Pre-Shared Key. &lt;br /&gt;
3. I&#39;m using a local user database for authentication by enabling AAA logins, so the user authentication is taken care of by the router. &lt;br /&gt;
for those who want to configure domain authentication, here&#39;s a link a found, but haven&#39;t tried yet.&lt;br /&gt;
http://www.blindhog.net/cisco-aaa-login-authentication-with-radius-ms-ias/&lt;br /&gt;
4. Setup an IP range in your network which is not under the common DHCP pool for your vpn clients&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I was facing a problem with getting a VPN client for this setup, because my CCO login doesnt have a technical agreement attached to it, and I couldn&#39;t find any pointers as to how i can add it. &lt;br /&gt;
&lt;br /&gt;
So I googled and found a few links where I could download it from&lt;br /&gt;
http://helpdesk.ugent.be/vpn/en/akkoord.php&lt;br /&gt;
&lt;br /&gt;
But this VPN client could only be installed on 32 bit systems, except for the AnyConnect client , but that supports only SSL connections, for which I would have to purchase individual user licenses.&lt;br /&gt;
&lt;br /&gt;
One option to install the 32 bit client on a 64 bit Windows 7 system , was to run the client in XP mode, and then do a NAT to the host computer. A little complicated but, apparently it works!&lt;br /&gt;
&lt;br /&gt;
http://blogs.nil.com/blog/2009/05/28/64-bit-windows-7-cisco-vpn-client-and-xp-mode-part-2/&lt;br /&gt;
&lt;br /&gt;
After some more googling, I found that Cisco did release a 64 bit VPN client , even though it was in beta.&lt;br /&gt;
&lt;br /&gt;
I&#39;m sorry that I&#39;m not able to paste the link for this client, because when I looked for the download link now, it&#39;s been taken offline. I tried to find it again, but all I could find were torrents. They should work too, but I haven&#39;t tried them.&lt;br /&gt;
&lt;br /&gt;
The version number for this client is Cisco VPN Client 5.0.07.0290 x64&lt;br /&gt;
&lt;br /&gt;
Once the client is running, you can configure the connection by giving your group name as Name and the Pre-Shared Key as your password. &lt;br /&gt;
&lt;br /&gt;
Once the router has connected, you will be asked for your user login. This is where the user database comes in. &lt;br /&gt;
&lt;br /&gt;
Once you put in the correct user details, you&#39;re logged in!</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/8641397846774003110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2011/02/cisco-887-and-vpn.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/8641397846774003110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/8641397846774003110'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2011/02/cisco-887-and-vpn.html' title='Cisco 887 and VPN'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-1635111590899584278</id><published>2010-11-12T23:11:00.000+03:00</published><updated>2011-08-18T11:46:41.809+03:00</updated><title type='text'>Outlook, POP3 and Outbox issues</title><content type='html'>A close friend of mine works as the IT manager for a construction company. He mentioned an interesting incident that happened at his office. He was facing problems with a few systems at his office. When users try to send emails, most of the time the mail would get stuck in outbox and not finish sending. It will finish only after he re-opened and sent it again or if he restarted outlook. He tried a lot of things to get it fixed like re-installing and even changing his internet router! Changing the router solved a lot of other problems but not this one! he did notice something odd. While trying to send , outlook would show Sending 1/800 or some huge number, but the number of items in Outbox was not more than 10. After a little bit of googling, he found a article which talked abt read receipts. it also talked abt a tool to check the number of pending read receipts, and cancel them manually. When he ran the tool on one system he found 600+ read receipts pending. After a boring few hours of manually clearing all the read receipts, outlook started working without any hassles. &lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/1635111590899584278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2010/11/outlook-pop3-and-outbox-issues.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/1635111590899584278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/1635111590899584278'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2010/11/outlook-pop3-and-outbox-issues.html' title='Outlook, POP3 and Outbox issues'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-182783159215280732</id><published>2010-11-12T22:32:00.001+03:00</published><updated>2011-08-18T11:47:01.984+03:00</updated><title type='text'>Cisco switches and virtual machines</title><content type='html'>A very interesting thing happened recently. A server running on centos , was setup as a base OS for 3 windows virtual machines - a domain controller, a database server, and an antivirus server. Last week the database server stopped responding. A restart didn&amp;#39;t solve the problem. Even pinging didn&amp;#39;t work. So the admin decided to restart the physical server itself. After the restart all the virtual machines stopped responding! A few more restarts , and checks on the network settings of the physical server, vm and there was no change. The admin disabled the physical network card and restarted the vms and servers. After re enabling the card suddenly the dc started responding and the physical server stopped responding! That&amp;#39;s when the admin decided to take a break and re-assess the situation. &lt;br /&gt;
He had one physical server, and 3 vms. One of the vms was responding on the LAN. The physical server and the other two vms were not responding to any requests. But he had done restarts before and this was a new thing. The only change he could point out was that he had replaced one of the 3com switches with a cisco 2900 managed switch. This was to  setup a gigabit uplink. It was a shot in the dark but we removed the server network cable from the cisco switch and plugged it into another 3com switch in the rack, and presto , all the servers and vms started responding. :) after doing a bit of reading, a particular setting on the cisco sets it to accept traffic only from one IP per port. that&amp;#39;s why even though the dc was responding, the physical server was not allowed to respond.  &lt;br /&gt;
&lt;br /&gt;
Now that&amp;#39;s what I call security. Good stuff, cisco!  &lt;br /&gt;
Sent from my BlackBerry&amp;#174; smartphone from VIVA</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/182783159215280732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2010/11/cisco-switches-and-virtual-machines.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/182783159215280732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/182783159215280732'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2010/11/cisco-switches-and-virtual-machines.html' title='Cisco switches and virtual machines'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-2541728365985677365</id><published>2010-10-21T00:45:00.000+03:00</published><updated>2010-10-21T00:45:02.166+03:00</updated><title type='text'>Untangle</title><content type='html'>A good friend of mine, Hussain, brought up an issue at one of his sites. The users were using up all the bandwidth, and he wanted an option where could control bandwidth and traffic. He basically listed a few requirements :&lt;br /&gt;
1. Bandwidth control&lt;br /&gt;
2. Content Filtering&lt;br /&gt;
3. Central user control&lt;br /&gt;
&lt;br /&gt;
Having worked with Microsoft technologies for sometime, I was tempted to suggest Forefront 2010. But he had mentioned that this was just an internet-sharing, non-domain enviroment. So I started looking elsewhere,and after a bit of googling, I came across Untangle (www.untangle.com). It&#39;s an open-source firewall/router with a few nice plugins that come for free, and some awesome plugins that you have to pay for.&lt;br /&gt;
&lt;br /&gt;
I downloaded the ISO (450Megs for the 32-bit version) , and burnt a CD. Once we setup a PC for use, I popped in the CD and started the install. Untangle comes in a few versions ,(1.Standalone OS - based on Debian, 2. Windows based.,etc). Since this PC was not going to be used for anything else, I started the Standalone OS install. The installation was pretty simple with a few prompts for hard disk partitioning and some features. After I rebooted into the OS, then the setup wizard started, asking about network settings.&lt;br /&gt;
&lt;br /&gt;
I entered the required settings, then the base OS came into view. The base OS is nicely designed with a dock at the bottom,showing the client icon and icons for terminal, reboot and shutdown.&lt;br /&gt;
You will be using the client mainly, which is a web-based client that opens up in Iceweasel.&lt;br /&gt;
After the first login, you will be asked to select the app packages that you want to install. They have a few questions as to what your installation will be used for, and then selects that packages based on your answers. You can customize the final selection , and start the download. There are a few big plugins, so be prepared to wait for the download to complete. I discovered this the hard way. While downloading the packages, I started playing the ADSL router settings, and in between I had to reset the router. I expected the download to resume on it&#39;s own. But it didn&#39;t :). So the package installation came up with an error message stating that apt-get exited with a code of 1! I tried restarting the package installation, but the error message came up again. So I was back on google, trying to find a solution. The untangle forums were very helpful, and the package installation procedure is properly logged in the log directory. I opened terminal and ran a command mentioned in the forums tail -n 100 -f /var/log/uvm/apt.log. This showed that one of the packages was not finishing it&#39;s installation. So I deleted the package, and restarted the download manually, using the apt-get command.Once the download completed properly, I could download apps using the GUI.&lt;br /&gt;
The interface is well designed and easy to navigate. &lt;br /&gt;
We&#39;ve put up the rules,and the firewall was responding properly. The installation is still under testing, let&#39;s see how the response is.</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/2541728365985677365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2010/10/untangle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/2541728365985677365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/2541728365985677365'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2010/10/untangle.html' title='Untangle'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2695996363157291447.post-2923779032216988208</id><published>2010-10-21T00:16:00.000+03:00</published><updated>2010-10-21T00:16:38.161+03:00</updated><title type='text'>In the beginning, there was a blog!</title><content type='html'>4+ years of being a system admin takes its toll on the mind. It&#39;s always been in the back of my mind to put down atleast some of the experiences I&#39;ve had, with regards to IT that is. Bahrain, being a small island in the Arabian Gulf, and my home for the most of my life, doesn&#39;t really provide a HUGE amount of opportunities to experience IT in it&#39;s entirety. You could pin it on the laid-back attitude of people in embracing new forms of technology, or just the lack of resources for support and encouragement. This is just my opinion btw. I&#39;m definitely interested in hearing an argument on this subject.&lt;br /&gt;
&lt;br /&gt;
So as of now, I&#39;m going to start penning down my IT experiences , and maybe I&#39;ll look back at it after a few years and smile! &lt;br /&gt;
&lt;br /&gt;
To infinity and beyond!!!....</content><link rel='replies' type='application/atom+xml' href='http://www.bahrainadmin.com/feeds/2923779032216988208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.bahrainadmin.com/2010/10/in-beginning-there-was-blog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/2923779032216988208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2695996363157291447/posts/default/2923779032216988208'/><link rel='alternate' type='text/html' href='http://www.bahrainadmin.com/2010/10/in-beginning-there-was-blog.html' title='In the beginning, there was a blog!'/><author><name>Arun Raveendran</name><uri>http://www.blogger.com/profile/00499544215148645767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>