Add standalone OCSentinel setup executable builder
Some checks failed
OfficeCom Sentinel Client / build-client (push) Has been cancelled
Some checks failed
OfficeCom Sentinel Client / build-client (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net10.0-windows</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<UseWindowsForms>false</UseWindowsForms>
|
||||
<AssemblyName>OCSentinelBootstrapper</AssemblyName>
|
||||
<RootNamespace>OCSentinelBootstrapper</RootNamespace>
|
||||
<PublishSingleFile>true</PublishSingleFile>
|
||||
<SelfContained>true</SelfContained>
|
||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||
<EnableCompressionInSingleFile>true</EnableCompressionInSingleFile>
|
||||
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="payload.zip" LogicalName="payload.zip" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
76
installer/OCSentinelBootstrapper/Program.cs
Normal file
76
installer/OCSentinelBootstrapper/Program.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
using System.Diagnostics;
|
||||
using System.IO.Compression;
|
||||
using System.Reflection;
|
||||
|
||||
namespace OCSentinelBootstrapper;
|
||||
|
||||
internal static class Program
|
||||
{
|
||||
private static int Main()
|
||||
{
|
||||
string tempRoot = Path.Combine(Path.GetTempPath(), "OCSentinelSetup", Guid.NewGuid().ToString("N"));
|
||||
string zipPath = Path.Combine(tempRoot, "payload.zip");
|
||||
string extractRoot = Path.Combine(tempRoot, "payload");
|
||||
|
||||
try
|
||||
{
|
||||
Directory.CreateDirectory(tempRoot);
|
||||
Directory.CreateDirectory(extractRoot);
|
||||
|
||||
ExtractEmbeddedPayload(zipPath);
|
||||
ZipFile.ExtractToDirectory(zipPath, extractRoot, overwriteFiles: true);
|
||||
|
||||
string installScript = Path.Combine(extractRoot, "scripts", "install-ocsentinel.ps1");
|
||||
if (!File.Exists(installScript))
|
||||
{
|
||||
throw new FileNotFoundException("Embedded payload did not contain install-ocsentinel.ps1", installScript);
|
||||
}
|
||||
|
||||
var process = new Process
|
||||
{
|
||||
StartInfo = new ProcessStartInfo
|
||||
{
|
||||
FileName = "powershell.exe",
|
||||
Arguments = $"-ExecutionPolicy Bypass -File \"{installScript}\"",
|
||||
UseShellExecute = false
|
||||
}
|
||||
};
|
||||
|
||||
process.Start();
|
||||
process.WaitForExit();
|
||||
return process.ExitCode;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.Error.WriteLine($"OCSentinel installer failed: {ex}");
|
||||
return 1;
|
||||
}
|
||||
finally
|
||||
{
|
||||
try
|
||||
{
|
||||
if (Directory.Exists(tempRoot))
|
||||
{
|
||||
Directory.Delete(tempRoot, recursive: true);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Best-effort cleanup only.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void ExtractEmbeddedPayload(string destinationPath)
|
||||
{
|
||||
Assembly assembly = Assembly.GetExecutingAssembly();
|
||||
using Stream? resourceStream = assembly.GetManifestResourceStream("payload.zip");
|
||||
if (resourceStream is null)
|
||||
{
|
||||
throw new InvalidOperationException("Embedded payload.zip resource was not found.");
|
||||
}
|
||||
|
||||
using FileStream output = File.Create(destinationPath);
|
||||
resourceStream.CopyTo(output);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user