diff --git a/.gitignore b/.gitignore
index 997839b..98c4cdd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@
bin/
obj/
publish/
+*.zip
# Skripte aus publish/ im Root behalten
!install-service.ps1
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..e19a91c
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,22 @@
+
+
+ true
+ win-x64
+
+ $([System.String]::Copy('1.0.0'))
+
+
+
+
+
+
+
+
+ $(GitTagRaw.TrimStart('v').Trim())
+ $(GitTagClean)
+ $(GitTagClean).0
+ $(GitTagClean).0
+
+
+
+
diff --git a/MailPrint/MailPrint.csproj b/MailPrint/MailPrint.csproj
index 0406fa1..bf4ea0a 100644
--- a/MailPrint/MailPrint.csproj
+++ b/MailPrint/MailPrint.csproj
@@ -8,9 +8,10 @@
MailPrint
MailPrint
Exe
- 1.0.0
- 1.0.0.0
- 1.0.0.0
+ true
+ win-x64
+ true
+ $(NoWarn);1591
diff --git a/MailPrint/Program.cs b/MailPrint/Program.cs
index 3e3c5a8..50c158b 100644
--- a/MailPrint/Program.cs
+++ b/MailPrint/Program.cs
@@ -51,7 +51,34 @@ try
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
- c.SwaggerDoc("v1", new() { Title = "MailPrint API", Version = "v1" }));
+ {
+ c.SwaggerDoc("v1", new() { Title = "MailPrint API", Version = "v1" });
+
+ // XML-Doku aus /// Kommentaren in OpenAPI uebernehmen
+ var xmlPath = Path.Combine(AppContext.BaseDirectory, "MailPrint.xml");
+ if (File.Exists(xmlPath))
+ c.IncludeXmlComments(xmlPath);
+
+ // API-Key-Security im Schema dokumentieren -> generierte Clients
+ // setzen den Header automatisch, Swagger UI hat Authorize-Button
+ var scheme = new Microsoft.OpenApi.Models.OpenApiSecurityScheme
+ {
+ Name = "X-Api-Key",
+ Type = Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey,
+ In = Microsoft.OpenApi.Models.ParameterLocation.Header,
+ Description = "API-Key fuer alle /api/* Endpunkte. Konfiguriert in MailPrintConfig.",
+ Reference = new Microsoft.OpenApi.Models.OpenApiReference
+ {
+ Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme,
+ Id = "ApiKey"
+ }
+ };
+ c.AddSecurityDefinition("ApiKey", scheme);
+ c.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement
+ {
+ [scheme] = Array.Empty()
+ });
+ });
var app = builder.Build();
app.UseSwagger();
diff --git a/MailPrintConfig/MailPrintConfig.csproj b/MailPrintConfig/MailPrintConfig.csproj
index f78cb16..4d09e5e 100644
--- a/MailPrintConfig/MailPrintConfig.csproj
+++ b/MailPrintConfig/MailPrintConfig.csproj
@@ -8,13 +8,14 @@
true
MailPrintConfig
MailPrintConfig
- 1.0.0
- 1.0.0.0
- 1.0.0.0
+ true
+ win-x64
+ app.manifest
+
diff --git a/MailPrintConfig/MainForm.cs b/MailPrintConfig/MainForm.cs
index aa4d363..5d98a89 100644
--- a/MailPrintConfig/MainForm.cs
+++ b/MailPrintConfig/MainForm.cs
@@ -491,6 +491,17 @@ public class MainForm : Form
?? Path.Combine(AppContext.BaseDirectory, "appsettings.json");
}
+ private static bool IsServiceRunning()
+ {
+ try
+ {
+ var svc = System.ServiceProcess.ServiceController.GetServices()
+ .FirstOrDefault(s => s.ServiceName == ServiceName);
+ return svc?.Status == System.ServiceProcess.ServiceControllerStatus.Running;
+ }
+ catch { return false; }
+ }
+
private void BrowseFolder(int rowIndex)
{
string? result = null;
@@ -714,6 +725,23 @@ public class MainForm : Form
Directory.CreateDirectory(Path.GetDirectoryName(path)!);
File.WriteAllText(path, root.ToString(Formatting.Indented));
SetStatus($"Gespeichert: {path}", Color.DarkGreen);
+
+ // Dienst-Neustart anbieten wenn Dienst läuft
+ if (IsServiceRunning())
+ {
+ if (MessageBox.Show(
+ "Konfiguration gespeichert.\n\nDienst jetzt neu starten um Änderungen zu übernehmen?",
+ "Dienst neu starten?",
+ MessageBoxButtons.YesNo,
+ MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ _ = ServiceActionAsync("stop").ContinueWith(async _ =>
+ {
+ await Task.Delay(1500);
+ await ServiceActionAsync("start");
+ });
+ }
+ }
}
catch (Exception ex) { SetStatus($"Fehler: {ex.Message}", Color.Red); }
}
@@ -785,10 +813,10 @@ public class MainForm : Form
private async Task ServiceActionAsync(string action)
{
- var publishDir = Path.GetDirectoryName(txtConfigPath.Text) ?? AppContext.BaseDirectory;
- var exePath = Path.Combine(publishDir, "MailPrint.exe");
- var installPs = Path.Combine(publishDir, "..", "install-service.ps1");
- var uninstallPs= Path.Combine(publishDir, "..", "uninstall-service.ps1");
+ var publishDir = Path.GetDirectoryName(txtConfigPath.Text) ?? AppContext.BaseDirectory;
+ var exePath = Path.Combine(publishDir, "MailPrint.exe");
+ var installPs = Path.Combine(publishDir, "install-service.ps1");
+ var uninstallPs = Path.Combine(publishDir, "uninstall-service.ps1");
// Bestätigung nur bei Install/Deinstall
if (action is "install" or "uninstall")
@@ -818,12 +846,13 @@ public class MainForm : Form
{
FileName = "powershell",
Arguments = $"-NoProfile -NonInteractive {cmd}",
- UseShellExecute = true,
- Verb = "runas",
- WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
+ UseShellExecute = false,
+ CreateNoWindow = true,
+ RedirectStandardError = true
};
using var p = System.Diagnostics.Process.Start(psi)!;
+ string err = await p.StandardError.ReadToEndAsync();
await p.WaitForExitAsync();
if (p.ExitCode == 0)
@@ -840,7 +869,7 @@ public class MainForm : Form
MessageBox.Show(successMsg, "Erfolgreich", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
- SetStatus($"'{action}' fehlgeschlagen (Code {p.ExitCode})", Color.Red);
+ SetStatus($"'{action}' fehlgeschlagen (Code {p.ExitCode}): {err.Trim()}", Color.Red);
}
catch (Exception ex) { SetStatus($"Fehler: {ex.Message}", Color.Red); }
finally { DisableServiceButtons(false); RefreshStartStop(); }
diff --git a/MailPrintConfig/Program.cs b/MailPrintConfig/Program.cs
index eec6102..68c48fd 100644
--- a/MailPrintConfig/Program.cs
+++ b/MailPrintConfig/Program.cs
@@ -1,5 +1,12 @@
using MailPrintConfig;
-Application.EnableVisualStyles();
-Application.SetCompatibleTextRenderingDefault(false);
-Application.Run(new MainForm());
+class Program
+{
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new MainForm());
+ }
+}
diff --git a/MailPrintConfig/app.manifest b/MailPrintConfig/app.manifest
new file mode 100644
index 0000000..07e6554
--- /dev/null
+++ b/MailPrintConfig/app.manifest
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build.bat b/build.bat
deleted file mode 100644
index df03f5f..0000000
--- a/build.bat
+++ /dev/null
@@ -1,17 +0,0 @@
-@echo off
-setlocal
-set PROJ=C:\Users\janwu\OneDrive - dimedtec GmbH\Programmierung\MailPrint\MailPrint\MailPrint.csproj
-dotnet restore "%PROJ%"
-if errorlevel 1 goto :err
-dotnet build "%PROJ%" -c Release
-if errorlevel 1 goto :err
-dotnet publish "%PROJ%" -c Release -r win-x64 --self-contained false -o "C:\Users\janwu\OneDrive - dimedtec GmbH\Programmierung\MailPrint\publish"
-if errorlevel 1 goto :err
-echo.
-echo === BUILD ERFOLGREICH ===
-goto :end
-:err
-echo.
-echo === BUILD FEHLGESCHLAGEN ===
-exit /b 1
-:end