Wie nehmen Sie Datei-Eigentum mit PowerShell?
Problem: ich möchte programmaticly (mit PowerShell), den Besitz der Datei übernehmen, dass ich absolut keine Berechtigungen auf.
Update: ich habe gründlich umgeschrieben, die Frage zu geben, Schritte zum reproduzieren des Problems. Hier ist, was ich Tue:
##########################################################
# Logon as UserA
##########################################################
$file = "C:\temp\file.txt"
new-item C:\temp -type dir
new-item $file -type file
# Remove inheritence
$isProtected = $true
$preserveInheritance = $true
$FileSecurity = Get-ACL $file
$FileSecurity.SetAccessRuleProtection($isProtected, $preserveInheritance)
Set-ACL $file -AclObject $FileSecurity
# Remove authenticated users
$user = "Authenticated Users"
$permission = "Modify"
$Account = New-Object System.Security.Principal.NTAccount($user)
$FileSystemRights = [System.Security.AccessControl.FileSystemRights]$permission
$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit, ObjectInherit"
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]"None"
$AccessControlType =[System.Security.AccessControl.AccessControlType]::Allow
$FileSystemAccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($Account, $FileSystemRights, $InheritanceFlag, $PropagationFlag, $AccessControlType)
$FileSecurity = Get-ACL $file
$FileSecurity.RemoveAccessRuleAll($FileSystemAccessRule)
Set-ACL $file -AclObject $FileSecurity
# Remove local users
$user = "BUILTIN\Users"
$permission = "ReadAndExecute"
$Account = New-Object System.Security.Principal.NTAccount($user)
$FileSystemRights = [System.Security.AccessControl.FileSystemRights]$permission
$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit, ObjectInherit"
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]"None"
$AccessControlType =[System.Security.AccessControl.AccessControlType]::Allow
$FileSystemAccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($Account, $FileSystemRights, $InheritanceFlag, $PropagationFlag, $AccessControlType)
$FileSecurity = Get-ACL $file
$FileSecurity.RemoveAccessRuleAll($FileSystemAccessRule)
Set-ACL $file -AclObject $FileSecurity
# Give the current user Full Control
$user = $env:username
$permission = "FullControl"
$FileSystemRights = [System.Security.AccessControl.FileSystemRights]$permission
$AccessControlType =[System.Security.AccessControl.AccessControlType]::Allow
$Account = New-Object System.Security.Principal.NTAccount($user)
$FileSystemAccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($Account, $FileSystemRights, $AccessControlType)
$FileSecurity = Get-ACL $file
$FileSecurity.AddAccessRule($FileSystemAccessRule)
Set-ACL $file -AclObject $FileSecurity
# Remove local administrators
$user = "BUILTIN\Administrators"
$permission = "FullControl"
$Account = New-Object System.Security.Principal.NTAccount($user)
$FileSystemRights = [System.Security.AccessControl.FileSystemRights]$permission
$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit, ObjectInherit"
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]"None"
$AccessControlType =[System.Security.AccessControl.AccessControlType]::Allow
$FileSystemAccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($Account, $FileSystemRights, $InheritanceFlag, $PropagationFlag, $AccessControlType)
$FileSecurity = Get-ACL $file
$FileSecurity.RemoveAccessRuleAll($FileSystemAccessRule)
Set-ACL $file -AclObject $FileSecurity
# Set the owner to be the current user
$user = $env:username
$Account = New-Object System.Security.Principal.NTAccount($user)
$FileSecurity = new-object System.Security.AccessControl.FileSecurity
$FileSecurity.SetOwner($Account)
[System.IO.File]::SetAccessControl($file, $FileSecurity)
##########################################################
# Log off the server as UserA and logon as UserB
##########################################################
$file = "C:\temp\file.txt"
# Take ownership
$user = $env:username
$Account = New-Object System.Security.Principal.NTAccount($user)
$FileSecurity = new-object System.Security.AccessControl.FileSecurity
$FileSecurity.SetOwner($Account)
[System.IO.File]::SetAccessControl($file, $FileSecurity)
Dieser wirft den Fehler:
Exception calling "SetAccessControl" with "2" argument(s): "Attempted to perform an unauthorized operation."
At line:1 char:35
+ [System.IO.File]::SetAccessControl <<<< ($path, $FileSecurity)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Zusätzliche Hinweise:
- $error[0].innerexception null ist.
- Die Schritte, die Sie als UserA sichergestellt, dass userB hat absolut keine Berechtigungen auf
C:\temp\file.txt
. - läuft
[System.IO.File]::GetAccessControl($path)
wirft eine ähnliche
Fehler (voraussichtlich) - Bin ich natürlich Rechtsklick auf PowerShell und wählen Sie "als Administrator Ausführen".
- Ich habe versucht, das deaktivieren der UAC, aber das bedeutet nicht einen Unterschied machen.
- Ich kann den Besitz über die GUI, so sollte es sein, einen Weg, dies zu tun programmgesteuert mit der PowerShell.
Was mache ich falsch?
Update und Antwort:
Die akzeptierte Antwort, die ich gepostet, funktioniert, scheint aber zu viel des guten. Einfach Verweis auf die Datei über einen UNC-Pfad scheint, den trick zu tun:
$file = "\\localhost\\c$\temp\file.txt"
# Take ownership
$user = $env:username
$Account = New-Object System.Security.Principal.NTAccount($user)
$FileSecurity = new-object System.Security.AccessControl.FileSecurity
$FileSecurity.SetOwner($Account)
[System.IO.File]::SetAccessControl($file, $FileSecurity)
- Danke! Die UNC-Lösung ist so viel sauberer als die anderen, die da draußen auf dem web. Wie hast du es herausgefunden?
InformationsquelleAutor Elijah W. Gagne | 2013-06-10
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich erkannt. Ich kann nur gemacht werden mit SE_RESTORE_NAME Berechtigungen.
Habe ich gelernt, wie zu tun, dass aus:
http://cosmoskey.blogspot.com/2010/07/setting-owner-on-acl-in-powershell.html
Und mit einem Kommentar von: http://fixingitpro.com/2011/07/08/set-owner-with-powershell-%E2%80%9Cthe-security-identifier-is-not-allowed-to-be-the-owner-of-this-object%E2%80%9D/
Hier ist der vollständige Befehl, das funktioniert für mich:
Probieren Sie etwas wie dieses: