Diventare proprietario di una cartella e aggiungere autorizzazioni complete a un account di dominio in PowerShell?


1

Ho una funzione Powershell che fa parte di questo, ma non usa l'account di dominio per diventare proprietario e aggiungere autorizzazioni ... usa un amministratore locale. C'è un modo migliore per farlo in Powershell?

<#

.SYNOPSIS
    Take ownership of a folder giving the ownership to ourdomain\myuser

.DESCRIPTION
    Takes ownership of a file the way my boss said to do when deleting a user's home directory.
    Using the GUI:
    1. Right click the folder and select properties.
    2. Click the "Security" tab.
    3. Click the "Advanced" button.
    4. Next to the "Owner:" label, click "Change"
    5. Enter ourdomain\myuser
    6. Click OK, OK, OK
    7. Right click the folder and select properties.
    8. Click the "Security" tab.
    9. Click the "Advanced" button.
    10. Click "Add"
    11. Next to "Principal:" click "Select a principal"
    12. Enter ourdomain\myuser
    13. Click OK
    14. Check "Full control"
    15. Click OK, OK, OK
    16. You should now be able to manipulate or delete the folder.
.NOTES
    File Name : Microsoft.PowerShell_profile.ps1
.EXAMPLE
    Take-Ownership R:\Redirected\Users\<username>
#>
function Take-Ownership {
   param(
     [String]$Folder
   )

   # Take ownership of the folder...  
   # (though I'd prefer if I could specify a user or group instead) 
   takeown.exe /A /F $Folder

   # Obtain the current ACL for this folder.
   $CurrentACL = Get-Acl $Folder

   # Add FullControl permissions to the ACL for the user.
   Write-Host ...Adding ourdomain\myuser to $Folder -Fore Yellow
   $SystemACLPermission = "ourdomain\myuser","FullControl","ContainerInherit,ObjectInherit","None","Allow"
   $SystemAccessRule = new-object System.Security.AccessControl.FileSystemAccessRule $SystemACLPermission
   $CurrentACL.AddAccessRule($SystemAccessRule)

   #Write-Host ...Adding Infrastructure Services to $Folder -Fore Yellow
   #$AdminACLPermission = "ourdomain\myuser","FullControl","ContainerInherit,ObjectInherit"."None","Allow"
   #$SystemAccessRule = new-object System.Security.AccessControl.FilesystemAccessRule $AdminACLPermission
   #$CurrentACL.AddAccessRule($SystemAccessRule)

   # Set the ACL again.
   Set-Acl -Path $Folder -AclObject $CurrentACL
}

1
Comprendo correttamente la tua domanda, vuoi ottenere l'autorizzazione in un altro contesto rispetto all'amministratore locale? In tal caso, utilizza più switch di takeown: takeown /s system /u domain\username /p password /f $folder /amaggiori informazioni intakeown /?
SimonS

Risposte:


1

Se stai impostando il proprietario di un oggetto sul gruppo Administrators, devi essere un amministratore locale. Altrimenti, le persone potrebbero banalmente eludere le quote del disco, poiché la contabilità delle quote si basa sulla proprietà dei file e le quote non influiscono sugli amministratori.

Se si esegue lo script come amministratore, è possibile impostare il proprietario di un oggetto su qualsiasi entità di sicurezza, dopo averne un po 'in giro. Avrai bisogno di questo script di regolazione dei privilegi di Lee Holmes, che ho modificato leggermente per rimuovere spazi bianchi extra e consentirne l'esecuzione più volte in una sessione:

param(    ## The privilege to adjust. This set is taken from
    ## http://msdn.microsoft.com/en-us/library/bb530716(VS.85).aspx
    [ValidateSet(
        "SeAssignPrimaryTokenPrivilege", "SeAuditPrivilege", "SeBackupPrivilege",
        "SeChangeNotifyPrivilege", "SeCreateGlobalPrivilege", "SeCreatePagefilePrivilege",
        "SeCreatePermanentPrivilege", "SeCreateSymbolicLinkPrivilege", "SeCreateTokenPrivilege",
        "SeDebugPrivilege", "SeEnableDelegationPrivilege", "SeImpersonatePrivilege", "SeIncreaseBasePriorityPrivilege",
        "SeIncreaseQuotaPrivilege", "SeIncreaseWorkingSetPrivilege", "SeLoadDriverPrivilege",
        "SeLockMemoryPrivilege", "SeMachineAccountPrivilege", "SeManageVolumePrivilege",
        "SeProfileSingleProcessPrivilege", "SeRelabelPrivilege", "SeRemoteShutdownPrivilege",
        "SeRestorePrivilege", "SeSecurityPrivilege", "SeShutdownPrivilege", "SeSyncAgentPrivilege",
        "SeSystemEnvironmentPrivilege", "SeSystemProfilePrivilege", "SeSystemtimePrivilege",
        "SeTakeOwnershipPrivilege", "SeTcbPrivilege", "SeTimeZonePrivilege", "SeTrustedCredManAccessPrivilege",
        "SeUndockPrivilege", "SeUnsolicitedInputPrivilege")]
    $Privilege,
    ## The process on which to adjust the privilege. Defaults to the current process.
    $ProcessId = $pid,
    ## Switch to disable the privilege, rather than enable it.
    [Switch] $Disable
)

## Taken from P/Invoke.NET with minor adjustments.
$definition = @'
using System;
using System.Runtime.InteropServices;
public class AdjPriv
{

    [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
    internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
    ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

    [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
    internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);

    [DllImport("advapi32.dll", SetLastError = true)]
    internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);

    [StructLayout(LayoutKind.Sequential, Pack = 1)]

    internal struct TokPriv1Luid
    {
        public int Count;
        public long Luid;
        public int Attr;
    }

    internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
    internal const int SE_PRIVILEGE_DISABLED = 0x00000000;
    internal const int TOKEN_QUERY = 0x00000008;
    internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;

    public static bool EnablePrivilege(long processHandle, string privilege, bool disable)
    {
        bool retVal;
        TokPriv1Luid tp;
        IntPtr hproc = new IntPtr(processHandle);
        IntPtr htok = IntPtr.Zero;
        retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
        tp.Count = 1;
        tp.Luid = 0;

        if(disable)
        {
            tp.Attr = SE_PRIVILEGE_DISABLED;
        }
        else
        {
            tp.Attr = SE_PRIVILEGE_ENABLED;
        }

        retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);
        retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
        return retVal;
    }
}

'@

$processHandle = (Get-Process -id $ProcessId).Handle
try { 
  Add-Type $definition 
} catch {} # Silent failure on re-registration

[AdjPriv]::EnablePrivilege($processHandle, $Privilege, $Disable)

L'ho salvato come privs.ps1. È quindi possibile chiamare .\privs.ps1 SeRestorePrivilegeper attivare il SeRestorePrivilegeprocesso, che consente di impostare la proprietà del file su chi si desidera.

Quindi, invece della takeownchiamata, puoi usare quell'oggetto ACL che hai già:

$ownerPrincipal = New-Object System.Security.Principal.NTAccount($newOwnerName)
$CurrentACL.SetOwner($ownerPrincipal)

Il nuovo proprietario verrà impostato contemporaneamente alla nuova ACL.

Infine, puoi disabilitare il privilegio extra:

.\privs.ps1 SeRestorePrivilege -Disable

Quindi stai dicendo che se gli utenti fossero in grado di impostare il proprietario di un file sul gruppo degli amministratori o addirittura impostare il proprietario su un account amministratore, avrebbero il potere di archiviare quanto vogliono semplicemente lasciando il loro possedere le autorizzazioni per i file che possedevano in precedenza e impostare il proprietario come amministratore; perché le quote sono calcolate in base a chi possiede i file. Beh, questo non è un concetto semplice, ma se riesci a confermare la mia comprensione, credo di capire quello che stai dicendo.
leeand00,

1
Sì, è corretto. L'unica cosa speciale di essere il proprietario di un file è che hai sempre il privilegio di lettura e scrittura-DAC su di esso e che le sue dimensioni contano rispetto alla tua quota.
Ben N,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.