Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何获得已具有使用powershell的完全控制权限的文件夹的所有权?_Powershell_Permissions_Acl_Ntfs - Fatal编程技术网

我如何获得已具有使用powershell的完全控制权限的文件夹的所有权?

我如何获得已具有使用powershell的完全控制权限的文件夹的所有权?,powershell,permissions,acl,ntfs,Powershell,Permissions,Acl,Ntfs,因此,我不是文件夹的所有者,也没有管理员权限,但我所属的组对文件夹拥有完全控制权,包括“取得所有权”和“更改权限”。这里有一点背景故事。我们有一台服务器,我们有一个共享驱动器,我们的IT部门有一个对我们的共享驱动器拥有完全控制权限的组,但是当用户创建新文件夹时,默认情况下,他们拥有对它的所有者访问权。我正在尝试设置一个powershell解决方案,该解决方案在我们的服务器上自动运行,并扫描共享驱动器以查找除IT部门组以外的所有人拥有的文件夹,然后将所有这些文件/文件夹的所有者更改为IT部门组。这

因此,我不是文件夹的所有者,也没有管理员权限,但我所属的组对文件夹拥有完全控制权,包括“取得所有权”和“更改权限”。这里有一点背景故事。我们有一台服务器,我们有一个共享驱动器,我们的IT部门有一个对我们的共享驱动器拥有完全控制权限的组,但是当用户创建新文件夹时,默认情况下,他们拥有对它的所有者访问权。我正在尝试设置一个powershell解决方案,该解决方案在我们的服务器上自动运行,并扫描共享驱动器以查找除IT部门组以外的所有人拥有的文件夹,然后将所有这些文件/文件夹的所有者更改为IT部门组。这样,当用户离开时,我们就可以访问文件,而不必访问更高的级别,因为我们没有对共享驱动器所在服务器的管理员访问权限

这是我到目前为止所拥有的

    #P/Invoke'd C# code to enable required privileges to take ownership and make changes when NTFS permissions are lacking
$AdjustTokenPrivileges = @"
using System;
using System.Runtime.InteropServices;

 public class TokenManipulator
 {
  [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("kernel32.dll", ExactSpelling = true)]
  internal static extern IntPtr GetCurrentProcess();
  [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_DISABLED = 0x00000000;
  internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
  internal const int TOKEN_QUERY = 0x00000008;
  internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
  public static bool AddPrivilege(string privilege)
  {
   try
   {
    bool retVal;
    TokPriv1Luid tp;
    IntPtr hproc = GetCurrentProcess();
    IntPtr htok = IntPtr.Zero;
    retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
    tp.Count = 1;
    tp.Luid = 0;
    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;
   }
   catch (Exception ex)
   {
    throw ex;
   }
  }
  public static bool RemovePrivilege(string privilege)
  {
   try
   {
    bool retVal;
    TokPriv1Luid tp;
    IntPtr hproc = GetCurrentProcess();
    IntPtr htok = IntPtr.Zero;
    retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
    tp.Count = 1;
    tp.Luid = 0;
    tp.Attr = SE_PRIVILEGE_DISABLED;
    retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);
    retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
    return retVal;
   }
   catch (Exception ex)
   {
    throw ex;
   }
  }
 }
"@
add-type $AdjustTokenPrivileges
#example for testing
$Folder = Get-Item "C:\Temp"
#Activate necessary admin privileges to make changes without NTFS perms
[void][TokenManipulator]::AddPrivilege("SeRestorePrivilege") #Necessary to set Owner Permissions
[void][TokenManipulator]::AddPrivilege("SeBackupPrivilege") #Necessary to bypass Traverse Checking
[void][TokenManipulator]::AddPrivilege("SeTakeOwnershipPrivilege") #Necessary to override FilePermissions

#Obtain a copy of the initial ACL
#$FolderACL = Get-ACL $Folder - gives error when run against a folder with no admin perms or ownership
#Create a new ACL object for the sole purpose of defining a new owner, and apply that update to the existing folder's ACL
$NewOwnerACL = New-Object System.Security.AccessControl.DirectorySecurity
#Establish the folder as owned by BUILTIN\Administrators, guaranteeing the following ACL changes can be applied
$Admin = New-Object System.Security.Principal.NTAccount("UECDOM\IT Department Group")
$NewOwnerACL.SetOwner($Admin)
#Merge the proposed changes (new owner) into the folder's actual ACL
$Folder.SetAccessControl($NewOwnerACL)

获取用户/组的
System.Security.Principal.IdentityReference

Get ChildItem-目录-递归

忽略已作为所有者具有该标识引用的文件夹

使用
Get ACL

使用
SetOwner
方法更改所有者

使用
设置ACL保存ACL

$Account = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList 'BUILTIN\Administrators'
Get-ChildItem 'C:\scripts' -Recurse -Directory | ?{ (Get-Acl $_.FullName).Owner -notlike $Account.Value} | %{
    $ACL = Get-ACL $_.FullName
    $ACL.SetOwner($Account)
    Set-Acl $_.FullName $ACL
}