feature: device profiles - set assigned user for logon

This commit is contained in:
Gary Sharp
2025-09-07 12:48:10 +10:00
parent 36c24542e1
commit 3e514fdf9a
13 changed files with 580 additions and 192 deletions
@@ -134,7 +134,10 @@ namespace Disco.Client.Extensions
if (enrolResponse.AssignedUserIsLocalAdmin) if (enrolResponse.AssignedUserIsLocalAdmin)
LocalAuthentication.AddLocalGroupMembership("Administrators", enrolResponse.AssignedUserSID, enrolResponse.AssignedUserUsername, enrolResponse.AssignedUserDomain); LocalAuthentication.AddLocalGroupMembership("Administrators", enrolResponse.AssignedUserSID, enrolResponse.AssignedUserUsername, enrolResponse.AssignedUserDomain);
}
if (enrolResponse.SetAssignedUserForLogon && !string.IsNullOrEmpty(enrolResponse.AssignedUserDomain) && !string.IsNullOrEmpty(enrolResponse.AssignedUserUsername))
{
// Make Windows think this user was the last to logon // Make Windows think this user was the last to logon
using (RegistryKey regWinlogon = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true)) using (RegistryKey regWinlogon = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true))
{ {
+7
View File
@@ -201,6 +201,10 @@
<Compile Include="Migrations\202507170522576_DBv28.Designer.cs"> <Compile Include="Migrations\202507170522576_DBv28.Designer.cs">
<DependentUpon>202507170522576_DBv28.cs</DependentUpon> <DependentUpon>202507170522576_DBv28.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Migrations\202509070209304_DBv29.cs" />
<Compile Include="Migrations\202509070209304_DBv29.Designer.cs">
<DependentUpon>202509070209304_DBv29.cs</DependentUpon>
</Compile>
<Compile Include="Migrations\Configuration.cs" /> <Compile Include="Migrations\Configuration.cs" />
<Compile Include="Migrations\DiscoDataMigrator.cs" /> <Compile Include="Migrations\DiscoDataMigrator.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
@@ -300,6 +304,9 @@
<EmbeddedResource Include="Migrations\202507170522576_DBv28.resx"> <EmbeddedResource Include="Migrations\202507170522576_DBv28.resx">
<DependentUpon>202507170522576_DBv28.cs</DependentUpon> <DependentUpon>202507170522576_DBv28.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Migrations\202509070209304_DBv29.resx">
<DependentUpon>202509070209304_DBv29.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx"> <EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator> <Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput> <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+27
View File
@@ -0,0 +1,27 @@
// <auto-generated />
namespace Disco.Data.Migrations
{
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
public sealed partial class DBv29 : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(DBv29));
string IMigrationMetadata.Id
{
get { return "202509070209304_DBv29"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}
@@ -0,0 +1,18 @@
namespace Disco.Data.Migrations
{
using System.Data.Entity.Migrations;
public partial class DBv29 : DbMigration
{
public override void Up()
{
AddColumn("dbo.DeviceProfiles", "SetAssignedUserForLogon", c => c.Boolean(nullable: false));
Sql("UPDATE dbo.DeviceProfiles SET SetAssignedUserForLogon = 1");
}
public override void Down()
{
DropColumn("dbo.DeviceProfiles", "SetAssignedUserForLogon");
}
}
}
File diff suppressed because one or more lines are too long
@@ -22,6 +22,7 @@ namespace Disco.Models.ClientServices
public string AssignedUserDescription { get; set; } public string AssignedUserDescription { get; set; }
public bool AssignedUserIsLocalAdmin { get; set; } public bool AssignedUserIsLocalAdmin { get; set; }
public bool SetAssignedUserForLogon { get; set; }
public string OfflineDomainJoinManifest { get; set; } public string OfflineDomainJoinManifest { get; set; }
@@ -38,6 +38,7 @@ namespace Disco.Models.Repository
public bool ProvisionADAccount { get; set; } public bool ProvisionADAccount { get; set; }
public bool AssignedUserLocalAdmin { get; set; } public bool AssignedUserLocalAdmin { get; set; }
public bool SetAssignedUserForLogon { get; set; }
public bool AllowUntrustedReimageJobEnrolment { get; set; } public bool AllowUntrustedReimageJobEnrolment { get; set; }
@@ -501,6 +501,8 @@ namespace Disco.Services.Devices.Enrolment
response.AllowBootstrapperUninstall = true; response.AllowBootstrapperUninstall = true;
} }
response.SetAssignedUserForLogon = device.DeviceProfile.SetAssignedUserForLogon;
// Provision Certificates // Provision Certificates
if (!string.IsNullOrEmpty(device.DeviceProfile.CertificateProviders) || if (!string.IsNullOrEmpty(device.DeviceProfile.CertificateProviders) ||
!string.IsNullOrEmpty(device.DeviceProfile.CertificateAuthorityProviders)) !string.IsNullOrEmpty(device.DeviceProfile.CertificateAuthorityProviders))
@@ -22,22 +22,23 @@ namespace Disco.Web.Areas.API.Controllers
{ {
public partial class DeviceProfileController : AuthorizedDatabaseController public partial class DeviceProfileController : AuthorizedDatabaseController
{ {
const string pDescription = "description"; private const string pDescription = "description";
const string pName = "name"; private const string pName = "name";
const string pShortName = "shortname"; private const string pShortName = "shortname";
const string pDistributionType = "distributiontype"; private const string pDistributionType = "distributiontype";
const string pCertificateProviders = "certificateproviders"; private const string pCertificateProviders = "certificateproviders";
const string pCertificateAuthorityProviders = "certificateauthorityproviders"; private const string pCertificateAuthorityProviders = "certificateauthorityproviders";
const string pWirelessProfileProviders = "wirelessprofileproviders"; private const string pWirelessProfileProviders = "wirelessprofileproviders";
const string pOrganisationalUnit = "organisationalunit"; private const string pOrganisationalUnit = "organisationalunit";
const string pDefaultOrganisationAddress = "defaultorganisationaddress"; private const string pDefaultOrganisationAddress = "defaultorganisationaddress";
const string pEnforceComputerNameConvention = "enforcecomputernameconvention"; private const string pEnforceComputerNameConvention = "enforcecomputernameconvention";
const string pEnforceOrganisationalUnit = "enforceorganisationalunit"; private const string pEnforceOrganisationalUnit = "enforceorganisationalunit";
const string pProvisionADAccount = "provisionadaccount"; private const string pProvisionADAccount = "provisionadaccount";
const string pAssignedUserLocalAdmin = "assigneduserlocaladmin"; private const string pAssignedUserLocalAdmin = "assigneduserlocaladmin";
const string pAllowUntrustedReimageJobEnrolment = "allowuntrustedreimagejobrnrolment"; private const string pSetAssignedUserForLogon = "setassigneduserforlogon";
const string pDevicesLinkedGroup = "deviceslinkedgroup"; private const string pAllowUntrustedReimageJobEnrolment = "allowuntrustedreimagejobrnrolment";
const string pAssignedUsersLinkedGroup = "assigneduserslinkedgroup"; private const string pDevicesLinkedGroup = "deviceslinkedgroup";
private const string pAssignedUsersLinkedGroup = "assigneduserslinkedgroup";
[DiscoAuthorize(Claims.Config.DeviceProfile.Configure)] [DiscoAuthorize(Claims.Config.DeviceProfile.Configure)]
[HttpPost, ValidateAntiForgeryToken] [HttpPost, ValidateAntiForgeryToken]
@@ -95,6 +96,9 @@ namespace Disco.Web.Areas.API.Controllers
case pAssignedUserLocalAdmin: case pAssignedUserLocalAdmin:
UpdateAssignedUserLocalAdmin(deviceProfile, value); UpdateAssignedUserLocalAdmin(deviceProfile, value);
break; break;
case pSetAssignedUserForLogon:
UpdateSetAssignedUserForLogon(deviceProfile, value);
break;
case pAllowUntrustedReimageJobEnrolment: case pAllowUntrustedReimageJobEnrolment:
UpdateAllowUntrustedReimageJobEnrolment(deviceProfile, value); UpdateAllowUntrustedReimageJobEnrolment(deviceProfile, value);
break; break;
@@ -347,6 +351,13 @@ namespace Disco.Web.Areas.API.Controllers
return Update(id, pProvisionADAccount, ProvisionADAccount, redirect); return Update(id, pProvisionADAccount, ProvisionADAccount, redirect);
} }
[DiscoAuthorize(Claims.Config.DeviceProfile.Configure)]
[HttpPost, ValidateAntiForgeryToken]
public virtual ActionResult UpdateSetAssignedUserForLogon(int id, string setAssignedUserForLogon = null, bool? redirect = null)
{
return Update(id, pSetAssignedUserForLogon, setAssignedUserForLogon, redirect);
}
[DiscoAuthorize(Claims.Config.DeviceProfile.Configure)] [DiscoAuthorize(Claims.Config.DeviceProfile.Configure)]
[HttpPost, ValidateAntiForgeryToken] [HttpPost, ValidateAntiForgeryToken]
public virtual ActionResult UpdateAssignedUserLocalAdmin(int id, string AssignedUserLocalAdmin = null, bool? redirect = null) public virtual ActionResult UpdateAssignedUserLocalAdmin(int id, string AssignedUserLocalAdmin = null, bool? redirect = null)
@@ -667,6 +678,18 @@ namespace Disco.Web.Areas.API.Controllers
throw new Exception("Invalid Boolean Value"); throw new Exception("Invalid Boolean Value");
} }
private void UpdateSetAssignedUserForLogon(DeviceProfile deviceProfile, string setAssignedUserForLogon)
{
if (bool.TryParse(setAssignedUserForLogon, out var bValue))
{
deviceProfile.SetAssignedUserForLogon = bValue;
Database.SaveChanges();
return;
}
throw new Exception("Invalid Boolean Value");
}
private void UpdateAllowUntrustedReimageJobEnrolment(DeviceProfile deviceProfile, string allowUntrustedReimageJobEnrolment) private void UpdateAllowUntrustedReimageJobEnrolment(DeviceProfile deviceProfile, string allowUntrustedReimageJobEnrolment)
{ {
if (bool.TryParse(allowUntrustedReimageJobEnrolment, out var bValue)) if (bool.TryParse(allowUntrustedReimageJobEnrolment, out var bValue))
@@ -134,7 +134,8 @@ namespace Disco.Web.Areas.Config.Controllers
ProvisionADAccount = true, ProvisionADAccount = true,
ComputerNameTemplate = DeviceProfile.DefaultComputerNameTemplate, ComputerNameTemplate = DeviceProfile.DefaultComputerNameTemplate,
DistributionType = DeviceProfile.DistributionTypes.OneToMany, DistributionType = DeviceProfile.DistributionTypes.OneToMany,
OrganisationalUnit = ActiveDirectory.Context.PrimaryDomain.DefaultComputerContainer OrganisationalUnit = ActiveDirectory.Context.PrimaryDomain.DefaultComputerContainer,
SetAssignedUserForLogon = true,
}; };
Database.DeviceProfiles.Add(deviceProfile); Database.DeviceProfiles.Add(deviceProfile);
@@ -258,6 +258,35 @@
</p> </p>
</div> </div>
</div> </div>
<div style="margin-top: 8px;">
@if (canConfig)
{
<input id="DeviceProfile_SetAssignedUserForLogon" type="checkbox" @(Model.DeviceProfile.SetAssignedUserForLogon ? new MvcHtmlString("checked=\"checked\" ") : new MvcHtmlString(string.Empty)) />
<script type="text/javascript">
$(function () {
document.DiscoFunctions.PropertyChangeHelper(
$('#DeviceProfile_SetAssignedUserForLogon'),
null,
'@Url.Action(MVC.API.DeviceProfile.UpdateSetAssignedUserForLogon(Model.DeviceProfile.Id))',
'setAssignedUserForLogon'
);
});
</script>
}
else
{
<input id="DeviceProfile_SetAssignedUserForLogon" type="checkbox" @(Model.DeviceProfile.SetAssignedUserForLogon ? new MvcHtmlString("checked=\"checked\" ") : new MvcHtmlString(string.Empty)) disabled="disabled" />
}
<label for="DeviceProfile_SetAssignedUserForLogon">
Set Assigned User for Logon
</label>
@AjaxHelpers.AjaxLoader()
<div class="info-box">
<p class="fa-p">
<i class="fa fa-info-circle"></i>When enabled the assigned user details will be pre-populated at the device logon screen.
</p>
</div>
</div>
<div style="margin-top: 8px;"> <div style="margin-top: 8px;">
@if (canConfig) @if (canConfig)
{ {
File diff suppressed because it is too large Load Diff
@@ -151,6 +151,12 @@ namespace Disco.Web.Areas.API.Controllers
} }
[NonAction] [NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public virtual System.Web.Mvc.ActionResult UpdateSetAssignedUserForLogon()
{
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateSetAssignedUserForLogon);
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public virtual System.Web.Mvc.ActionResult UpdateAssignedUserLocalAdmin() public virtual System.Web.Mvc.ActionResult UpdateAssignedUserLocalAdmin()
{ {
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateAssignedUserLocalAdmin); return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateAssignedUserLocalAdmin);
@@ -222,6 +228,7 @@ namespace Disco.Web.Areas.API.Controllers
public readonly string UpdateEnforceComputerNameConvention = "UpdateEnforceComputerNameConvention"; public readonly string UpdateEnforceComputerNameConvention = "UpdateEnforceComputerNameConvention";
public readonly string UpdateEnforceOrganisationalUnit = "UpdateEnforceOrganisationalUnit"; public readonly string UpdateEnforceOrganisationalUnit = "UpdateEnforceOrganisationalUnit";
public readonly string UpdateProvisionADAccount = "UpdateProvisionADAccount"; public readonly string UpdateProvisionADAccount = "UpdateProvisionADAccount";
public readonly string UpdateSetAssignedUserForLogon = "UpdateSetAssignedUserForLogon";
public readonly string UpdateAssignedUserLocalAdmin = "UpdateAssignedUserLocalAdmin"; public readonly string UpdateAssignedUserLocalAdmin = "UpdateAssignedUserLocalAdmin";
public readonly string UpdateAllowUntrustedReimageJobEnrolment = "UpdateAllowUntrustedReimageJobEnrolment"; public readonly string UpdateAllowUntrustedReimageJobEnrolment = "UpdateAllowUntrustedReimageJobEnrolment";
public readonly string UpdateDevicesLinkedGroup = "UpdateDevicesLinkedGroup"; public readonly string UpdateDevicesLinkedGroup = "UpdateDevicesLinkedGroup";
@@ -249,6 +256,7 @@ namespace Disco.Web.Areas.API.Controllers
public const string UpdateEnforceComputerNameConvention = "UpdateEnforceComputerNameConvention"; public const string UpdateEnforceComputerNameConvention = "UpdateEnforceComputerNameConvention";
public const string UpdateEnforceOrganisationalUnit = "UpdateEnforceOrganisationalUnit"; public const string UpdateEnforceOrganisationalUnit = "UpdateEnforceOrganisationalUnit";
public const string UpdateProvisionADAccount = "UpdateProvisionADAccount"; public const string UpdateProvisionADAccount = "UpdateProvisionADAccount";
public const string UpdateSetAssignedUserForLogon = "UpdateSetAssignedUserForLogon";
public const string UpdateAssignedUserLocalAdmin = "UpdateAssignedUserLocalAdmin"; public const string UpdateAssignedUserLocalAdmin = "UpdateAssignedUserLocalAdmin";
public const string UpdateAllowUntrustedReimageJobEnrolment = "UpdateAllowUntrustedReimageJobEnrolment"; public const string UpdateAllowUntrustedReimageJobEnrolment = "UpdateAllowUntrustedReimageJobEnrolment";
public const string UpdateDevicesLinkedGroup = "UpdateDevicesLinkedGroup"; public const string UpdateDevicesLinkedGroup = "UpdateDevicesLinkedGroup";
@@ -411,6 +419,16 @@ namespace Disco.Web.Areas.API.Controllers
public readonly string ProvisionADAccount = "ProvisionADAccount"; public readonly string ProvisionADAccount = "ProvisionADAccount";
public readonly string redirect = "redirect"; public readonly string redirect = "redirect";
} }
static readonly ActionParamsClass_UpdateSetAssignedUserForLogon s_params_UpdateSetAssignedUserForLogon = new ActionParamsClass_UpdateSetAssignedUserForLogon();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionParamsClass_UpdateSetAssignedUserForLogon UpdateSetAssignedUserForLogonParams { get { return s_params_UpdateSetAssignedUserForLogon; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionParamsClass_UpdateSetAssignedUserForLogon
{
public readonly string id = "id";
public readonly string setAssignedUserForLogon = "setAssignedUserForLogon";
public readonly string redirect = "redirect";
}
static readonly ActionParamsClass_UpdateAssignedUserLocalAdmin s_params_UpdateAssignedUserLocalAdmin = new ActionParamsClass_UpdateAssignedUserLocalAdmin(); static readonly ActionParamsClass_UpdateAssignedUserLocalAdmin s_params_UpdateAssignedUserLocalAdmin = new ActionParamsClass_UpdateAssignedUserLocalAdmin();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionParamsClass_UpdateAssignedUserLocalAdmin UpdateAssignedUserLocalAdminParams { get { return s_params_UpdateAssignedUserLocalAdmin; } } public ActionParamsClass_UpdateAssignedUserLocalAdmin UpdateAssignedUserLocalAdminParams { get { return s_params_UpdateAssignedUserLocalAdmin; } }
@@ -709,6 +727,20 @@ namespace Disco.Web.Areas.API.Controllers
return callInfo; return callInfo;
} }
[NonAction]
partial void UpdateSetAssignedUserForLogonOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string setAssignedUserForLogon, bool? redirect);
[NonAction]
public override System.Web.Mvc.ActionResult UpdateSetAssignedUserForLogon(int id, string setAssignedUserForLogon, bool? redirect)
{
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateSetAssignedUserForLogon);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "setAssignedUserForLogon", setAssignedUserForLogon);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect);
UpdateSetAssignedUserForLogonOverride(callInfo, id, setAssignedUserForLogon, redirect);
return callInfo;
}
[NonAction] [NonAction]
partial void UpdateAssignedUserLocalAdminOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string AssignedUserLocalAdmin, bool? redirect); partial void UpdateAssignedUserLocalAdminOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string AssignedUserLocalAdmin, bool? redirect);