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