CLI tool for running Playbooks
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
3.5 KiB

using System;
using System.DirectoryServices;
using System.Threading.Tasks;
using TrustedUninstaller.Shared.Tasks;
using YamlDotNet.Serialization;
using System.DirectoryServices.AccountManagement;
using System.Security.Principal;
namespace TrustedUninstaller.Shared.Actions
{
public class UserAction : TaskAction, ITaskAction
{
public void RunTaskOnMainThread() { throw new NotImplementedException(); }
[YamlMember(typeof(string), Alias = "name")]
public string Username { get; set; } = "";
[YamlMember(typeof(bool), Alias = "admin")]
public bool IsAdmin { get; set; } = false;
[YamlMember(typeof(string), Alias = "weight")]
public int ProgressWeight { get; set; } = 1;
public int GetProgressWeight() => ProgressWeight;
private bool InProgress { get; set; }
public void ResetProgress() => InProgress = false;
public string ErrorString() => $"UserAction failed to change permissions for user {Username}.";
public UninstallTaskStatus GetStatus()
{
using var pc = new PrincipalContext(ContextType.Machine);
var up = UserPrincipal.FindByIdentity(
pc,
IdentityType.SamAccountName,
this.Username);
var userExists = (up != null);
if (!IsAdmin || !userExists) return userExists ? UninstallTaskStatus.Completed : UninstallTaskStatus.ToDo;
var identity = new WindowsIdentity(up.UserPrincipalName);
var principal = new WindowsPrincipal(identity);
var isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
return isAdmin ? UninstallTaskStatus.Completed : UninstallTaskStatus.ToDo;
}
public async Task<bool> RunTask()
{
if (this.GetStatus() != UninstallTaskStatus.ToDo)
{
return false;
}
Console.WriteLine($"Changing permissions for user '{Username}'...");
return await Task.Run(() =>
{
using var pc = new PrincipalContext(ContextType.Machine);
var up = UserPrincipal.FindByIdentity(
pc,
IdentityType.SamAccountName,
this.Username);
var userExists = (up != null);
var ad = new DirectoryEntry("WinNT://" +
Environment.MachineName + ",computer");
if (!userExists)
{
var newUser = ad.Children.Add(this.Username, "user");
newUser.Invoke("SetPassword", "user");
newUser.Invoke("Put", "Description", "Created by the AME Wizard");
newUser.CommitChanges();
if (IsAdmin)
{
var group = ad.Children.Find("Administrators", "group");
group.Invoke("Add", newUser.Path);
group.CommitChanges();
}
}
else
{
if (IsAdmin)
{
var group = ad.Children.Find("Administrators", "group");
group.Invoke("Add", up.UserPrincipalName);
group.CommitChanges();
}
}
return true;
});
}
}
}