Better error logging for non-Administrator/headless server scenarios
Three improvements for users running on servers where the Windows account is not "Administrator" or where the environment is headless (Service, RDP- disconnected, no interactive desktop): 1. readSettingsFile / readSessionFile: distinguish ENOENT (normal first run) from EACCES/EPERM (permission problem). The latter logs an explicit message including the current Windows username so the user can spot misconfigured ACLs immediately. 2. ensureBaseDir: log EACCES/EPERM with the current username before re- throwing. Previously the error bubbled up without any hint why the AppData directory creation failed. 3. createTray: log a warning when Tray creation fails (typical on Windows Service / headless servers / RDP disconnected sessions). Previously the error was silently swallowed and minimize-to-tray would just not work without explanation. These errors were silently swallowed before, making it impossible to diagnose problems on servers with restricted user accounts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
f44a321e74
commit
d4b98ad172
+18
-14
@@ -136,7 +136,11 @@ function createTray(): void {
|
||||
const iconPath = path.join(app.getAppPath(), "assets", "app_icon.ico");
|
||||
try {
|
||||
tray = new Tray(iconPath);
|
||||
} catch {
|
||||
} catch (error) {
|
||||
// Fails on headless servers / Windows Service / RDP-disconnected sessions.
|
||||
// Log so a user running on a non-Administrator/headless server can see
|
||||
// why minimize-to-tray doesn't work, instead of getting an inaccessible window.
|
||||
logger.warn(`Tray-Icon konnte nicht erstellt werden (Headless/RDP/Service?): ${String(error)} - Minimize-to-Tray steht nicht zur Verfuegung, Fenster bleibt sichtbar.`);
|
||||
return;
|
||||
}
|
||||
tray.setToolTip(APP_NAME);
|
||||
@@ -524,19 +528,19 @@ function registerIpcHandlers(): void {
|
||||
return { saved: true };
|
||||
});
|
||||
|
||||
ipcMain.handle(IPC_CHANNELS.EXPORT_SUPPORT_BUNDLE, async () => {
|
||||
const options = {
|
||||
defaultPath: controller.getSupportBundleDefaultFileName(),
|
||||
filters: [{ name: "Support Bundle", extensions: ["zip"] }]
|
||||
};
|
||||
const result = mainWindow ? await dialog.showSaveDialog(mainWindow, options) : await dialog.showSaveDialog(options);
|
||||
if (result.canceled || !result.filePath) {
|
||||
return { saved: false };
|
||||
}
|
||||
const exported = controller.exportSupportBundle();
|
||||
await fs.promises.writeFile(result.filePath, exported.buffer);
|
||||
return { saved: true, filePath: result.filePath };
|
||||
});
|
||||
ipcMain.handle(IPC_CHANNELS.EXPORT_SUPPORT_BUNDLE, async () => {
|
||||
const options = {
|
||||
defaultPath: controller.getSupportBundleDefaultFileName(),
|
||||
filters: [{ name: "Support Bundle", extensions: ["zip"] }]
|
||||
};
|
||||
const result = mainWindow ? await dialog.showSaveDialog(mainWindow, options) : await dialog.showSaveDialog(options);
|
||||
if (result.canceled || !result.filePath) {
|
||||
return { saved: false };
|
||||
}
|
||||
const exported = controller.exportSupportBundle();
|
||||
await fs.promises.writeFile(result.filePath, exported.buffer);
|
||||
return { saved: true, filePath: result.filePath };
|
||||
});
|
||||
|
||||
ipcMain.handle(IPC_CHANNELS.OPEN_LOG, async () => {
|
||||
const logPath = getLogFilePath();
|
||||
|
||||
Reference in New Issue
Block a user