Fix agent build errors for .NET 8 (File.GetAccessControl moved to FileInfo)
Build Fix: .NET 8 API changes
Problem:
- Agent failed to compile with .NET 8.0.424
- Error: 'File' does not contain a definition for 'GetAccessControl'
- Error: 'File' does not contain a definition for 'SetAccessControl'
Root Cause:
- File.GetAccessControl() and File.SetAccessControl() removed in .NET 5+
- Moved to System.IO.FileSystem.AccessControl package as extension methods
- Methods now on FileInfo/DirectoryInfo classes, not File static class
Solution:
1. Added package reference:
- System.IO.FileSystem.AccessControl v5.0.0 (ShopDbEndpointAgent.Core.csproj)
2. Added using directive:
- using System.Security.AccessControl; (CertificateRenewal.cs)
3. Changed API usage (CertificateRenewal.cs:290-298):
Before:
var acl = File.GetAccessControl(keyFile);
File.SetAccessControl(keyFile, acl);
After:
var fileInfo = new FileInfo(keyFile);
var acl = fileInfo.GetAccessControl();
fileInfo.SetAccessControl(acl);
Build Results:
- ShopDbEndpointAgent.Core: SUCCESS (1 warning, 0 errors)
- ShopDbEndpointAgent: SUCCESS (0 warnings, 0 errors)
- ShopDbEndpointAgent.Tray: SUCCESS (0 warnings, 0 errors)
- Published to agent/publish/agent/ and agent/publish/tray/
Context:
- Private key ACL grants required for tray app access (CertificateRenewal.cs:290)
- BUILTIN\Users group needs Read+ReadAndExecute on private key file
- Enables certificate renewal from both service and tray contexts
Related Changes:
- CertificateExpiryMonitor.cs (periodic monitoring, commit bb301c6)
- CertificateRenewal.cs (server cert validation, commit 702eeb3)
- All security fixes operational after this build
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net.Http;
|
||||
using System.Security.AccessControl;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
@@ -287,14 +288,14 @@ public class CertificateRenewal
|
||||
var keyFile = Path.Combine(searchPath, keyPath);
|
||||
if (File.Exists(keyFile))
|
||||
{
|
||||
var acl = File.GetAccessControl(keyFile);
|
||||
var rule = new System.Security.AccessControl.FileSystemAccessRule(
|
||||
var fileInfo = new FileInfo(keyFile);
|
||||
var acl = fileInfo.GetAccessControl();
|
||||
var rule = new FileSystemAccessRule(
|
||||
"BUILTIN\\Users",
|
||||
System.Security.AccessControl.FileSystemRights.Read |
|
||||
System.Security.AccessControl.FileSystemRights.ReadAndExecute,
|
||||
System.Security.AccessControl.AccessControlType.Allow);
|
||||
FileSystemRights.Read | FileSystemRights.ReadAndExecute,
|
||||
AccessControlType.Allow);
|
||||
acl.AddAccessRule(rule);
|
||||
File.SetAccessControl(keyFile, acl);
|
||||
fileInfo.SetAccessControl(acl);
|
||||
|
||||
logger.LogInformation("Granted Users group access to private key at {KeyFile}", keyFile);
|
||||
return;
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
explicit DACL. The service creates it as LocalSystem, and without a
|
||||
granted ACE the unelevated tray cannot open it. -->
|
||||
<PackageReference Include="System.Threading.AccessControl" Version="8.0.0" />
|
||||
<!-- FileSystem.AccessControl: setting ACLs on private key files for certificate
|
||||
renewal (File.GetAccessControl/SetAccessControl moved to this package in .NET 8+) -->
|
||||
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
Reference in New Issue
Block a user