iOfficeAI/OfficeCLI · error · InvalidOperationException
word_not_authentic: {name}
Error message
word_not_authentic: {name} What it means
Thrown by DocxToPdf after CoCreateInstance instantiates CLSID {000209FF-0000-0000-C000-000000000046} (Word.Application) and queries its Name property. If the name does not contain 'Microsoft Word' (case-insensitive), the backend refuses to proceed, because a different application or a non-Word COM server registered under that CLSID would silently produce garbage or hang. This is a security/authenticity guard: it prevents the PDF backend from driving an unexpected or spoofed COM server that happens to occupy Word's class ID.
Source
Thrown at src/officecli/Core/WordPdfBackend.cs:461
int srcStride = p.w * 4;
for (int row = 0; row < p.h; row++)
Array.Copy(p.pixels, row * srcStride, target, (y0 + row) * targetStride + x0 * 4, srcStride);
}
return EncodeBgraToPng(factory, target, W, H);
}
finally { Marshal.Release(factory); }
}
static string DocxToPdf(string docx)
{
var pdf = Path.Combine(Path.GetTempPath(), $"_w_{Guid.NewGuid():N}.pdf");
var clsid = G_Word; var iid = G_IDispatch;
CoCreateInstance(ref clsid, IntPtr.Zero, 4, ref iid, out var word);
try
{
var name = (string?)DispGet(word, "Name") ?? "";
if (!name.Contains("Microsoft Word", StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException("word_not_authentic: " + name);
DispSet(word, "Visible", false);
DispSet(word, "DisplayAlerts", 0);
try { DispSet(word, "AutomationSecurity", 3); } catch { }
var docs = (IntPtr)DispGet(word, "Documents")!;
try
{
var doc = (IntPtr)DispMethod(docs, "Open", docx, MISSING, true, false)!;
try { DispMethod(doc, "SaveAs2", pdf, 17); }
finally { try { DispMethod(doc, "Close", false); } catch { } Marshal.Release(doc); }
}
finally { Marshal.Release(docs); }
}
finally
{
try { DispMethod(word, "Quit"); } catch { }
Marshal.Release(word);View on GitHub (pinned to 1ced45e900)
Solutions
- Run 'winword.exe' manually to confirm Word launches and reports itself as 'Microsoft Word' in its title bar.
- Repair the Office installation: Settings > Apps > Microsoft 365/Office > Modify > Online Repair.
- If the Name property returns a localized or version-specific string (e.g. 'Microsoft Word 2016'), the Contains check already handles that — if it still fails, inspect the exact Name value returned and report it.
- On a server, install Word via a volume-license Office build rather than click-to-run, which is known to leave registration stubs.
Defensive patterns
Strategy: validation
Validate before calling
// Check that Word reports itself correctly before relying on the backend
// This mirrors the internal check; if it fails, PDF conversion is unavailable
var clsid = new Guid("000209FF-0000-0000-C000-000000000046");
var iid = new Guid("00020400-0000-0000-C000-000000000046");
try
{
WordPdfBackend.CoCreateInstance(ref clsid, IntPtr.Zero, 4, ref iid, out var word);
try
{
var name = (string)WordPdfBackend.DispGet(word, "Name");
if (!name.Contains("Microsoft Word", StringComparison.OrdinalIgnoreCase))
throw new PlatformNotSupportedException($"Word authenticity check failed: {name}");
}
finally { Marshal.Release(word); }
}
catch { /* Word not available or not authentic */ } Try / catch
try
{
var pdf = WordPdfBackend.DocxToPdf(docxPath);
}
catch (InvalidOperationException ex) when (ex.Message.StartsWith("word_not_authentic"))
{
// The COM server under Word's CLSID is not genuine Microsoft Word
logger.LogError("Word authenticity check failed: {Detail}", ex.Message);
throw new PlatformNotSupportedException(
"PDF conversion requires genuine Microsoft Word to be installed.");
} Prevention
- Install the full desktop Microsoft Word application, not just Office runtimes or viewers.
- On servers, use a volume-license Office build; avoid click-to-run stubs that may not fully register.
- If using Wine/CrossOver, verify the COM bridge reports the expected Name property.
- Run a Word repair (Online Repair via Settings > Apps) if the install is partially damaged.
When it happens
Trigger: The CLSID {000209FF-...} is registered but resolves to something other than Microsoft Word — e.g. an Outlook MAPI or Office runtime stub on machines with only a partial Office install, a third-party application that hijacked the CLSID, a Wine/Corosiva-CrossOver environment where the COM server reports a different Name, or a registry corruption where Word is partially uninstalled but the CLSID entry remains.
Common situations: Server with Office Online Server or Office runtime redistributable but no desktop Word; a machine with only Microsoft 365 click-to-run streaming stub where Word is not fully downloaded yet; WINE/CrossOver where the COM bridge reports a Wine-specific name; a damaged Office install after a failed update.
Related errors
AI-assisted analysis of iOfficeAI/OfficeCLI@1ced45e900 (2026-08-13).
Data as JSON: /api/errors/8b0eec1af96f9b30.
Report an issue: GitHub.