2011-11-21 17 views
6

Tôi có câu hỏi về Get-Acl ở Powershell. Tôi tiếp tục nhận được thông báo lỗi "Truy cập vào đường dẫn bị từ chối". Tôi muốn thay đổi chủ sở hữu của thư mục cho chính tôi và sau đó cung cấp cho bản thân mình đầy đủ quyền truy cập vào thư mục bằng cách sử dụng Powershell. Đây là dòng mã cho tôi lỗi:Làm cách nào để thay đổi chủ sở hữu của thư mục bằng Powershell khi Get-Acl trả về "Truy cập bị từ chối"?

$acl = Get-Acl "C:\SomeFolder" 

Tôi đang sử dụng Windows Explorer để đặt quyền trên "SomeFolder" trước khi chạy tập lệnh. Họ là như sau:

  • không mục trong danh sách điều khiển truy cập
  • chủ sở hữu không phải là bản thân mình

tôi không nhận được thông báo lỗi nếu tôi làm cho bản thân mình chủ sở hữu bằng cách sử dụng giao diện Windows Explorer trước chạy tập lệnh Powershell. Tôi không hiểu tại sao tôi được phép thay đổi chủ sở hữu bằng Windows Explorer nhưng không được sử dụng Powershell? Tôi có toàn quyền quản trị trên máy này. Windows 7, Powershell 2.0, .NET 3.5.

Tôi giả sử cách duy nhất để thay đổi chủ sở hữu là sử dụng Get-Acl, đặt chủ sở hữu trên ACL, sau đó sử dụng Set-Acl để viết lại thư mục. Nếu có một cách khác, xin vui lòng cho tôi biết? Làm thế nào tôi có thể thay đổi chủ sở hữu của thư mục bằng cách sử dụng Powershell?

Trả lời

8

Windows Vista trở lên bao gồm công cụ dòng lệnh có tên takeown.exe có thể được sử dụng từ dấu kiểm nhắc lệnh nâng cao (hoặc bảng điều khiển nâng cao) để thay đổi quyền sở hữu đối tượng hệ thống tệp.

takeown /F "C:\SomeFolder" /R /D Y 

sẽ cấp cho bạn quyền sở hữu trên C: \ SomeFolder và đối tượng hệ thống tệp chứa.

+0

Cảm ơn bạn, điều này thực sự hoạt động! – ajh4

+0

Bạn cũng có thể sử dụng icacls Tôi tin rằng trên Windows 7 với công tắc/setowner. Chỉ cần đề cập đến một thay thế cho takeown.exe. – Paolis

4

Tôi có một số tập lệnh cấu hình hệ thống từ người xây dựng của chúng tôi và tôi nhớ lại một lưu ý về lệnh Get-Acl "không hoạt động tốt trên một số đường dẫn nhất định".

# NOTE: This method does not work well? 
#$acl = Get-Acl -Path $Path 

Các loại đường dẫn mà chúng tôi đã đặt quyền là thư mục trống do người dùng quản trị viên tạo sau này được chụp trong ảnh đĩa. Đây là lệnh PowerShell mà chúng ta đã sử dụng.

$acl = (Get-Item $path).GetAccessControl("Access") 

Oh, và nó được thực mơ hồ khi bạn có một đối tượng ACL. Tôi không biết đây có phải là cách tốt nhất để làm điều đó không, nhưng đó là một đoạn trích từ cùng một tập lệnh mà tôi đề cập ở trên.

$acl = (Get-Item $path).GetAccessControl("Access") 

# Setup the access rule. 
$allInherit = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit", "ObjectInherit" 
$allPropagation = [System.Security.AccessControl.PropagationFlags]"None" 
$AR = New-Object System.Security.AccessControl.FileSystemAccessRule $user, $permissions, $allInherit, $allPropagation, "Allow" 

# Check if Access already exists. 
if ($acl.Access | Where { $_.IdentityReference -eq $User}) 
{ 
    $accessModification = New-Object System.Security.AccessControl.AccessControlModification 
    $accessModification.value__ = 2 
    $modification = $false 
    $acl.ModifyAccessRule($accessModification, $AR, [ref]$modification) | Out-Null 
} 
else 
{ 
    $acl.AddAccessRule($AR) 
} 

Set-Acl -AclObject $acl -Path $Path 
+0

Cảm ơn bạn đã trả lời. Tôi vẫn nhận được thông báo từ chối truy cập trên dòng đầu tiên của mã. '$ acl = (Get-Item $ path) .GetAccessControl (" Truy cập ")' Tôi thậm chí đã thử tất cả các đối số có thể có mà phương thức GetAccessControl chấp nhận (Không, Kiểm toán, Chủ sở hữu, Quyền truy cập, Chủ sở hữu, Nhóm, Tất cả). Nhưng vẫn không có may mắn, truy cập bị từ chối. – ajh4

+0

Bạn đã có một vấn đề cơ bản cho phép người dùng. Bắt đầu thử lệnh trên các thư mục khác nhau (dirs trong Windows \, ​​dirs cùng một người dùng được tạo, v.v.). –

+0

Bạn là chính xác. Tôi đã có vấn đề về quyền. Cảm ơn! Tôi đã sử dụng lệnh 'whoami/priv'. Tôi phát hiện ra rằng tôi chưa bật SeTakeOwnershipPrivilege. Nó là rất lộn xộn để kích hoạt nó bằng cách sử dụng PowerShell. Đây là một ví dụ về cách kích hoạt nó [link] (http://www.leeholmes.com/blog/2010/09/24/adjusting-token-privileges-in-powershell/) Sau khi bật đặc quyền, tôi đã tạo ACL mới, đặt chủ sở hữu trên acl mới đó và cuối cùng đã sử dụng set-acl để lưu ACL trở lại thư mục. cảm ơn sự giúp đỡ của bạn – ajh4

0

mã ở trên hoạt động rất tốt. muốn đăng một tinh chỉnh để đệ quy đi qua thư mục và điền vào một số "thiếu"

$HomeFolders = Get-ChildItem "put your directory root here" -Directory -recurse 
foreach ($HomeFolder in $HomeFolders) { 
    $Path = $HomeFolder.FullName 
    $acl = (Get-Item $Path).GetAccessControl('Access') 
    $allInherit = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit", "ObjectInherit" 
    $allPropagation = [System.Security.AccessControl.PropagationFlags]"None" 
    $permissions = "FullControl" 
    $Username = "<put your name here>" 
    $AR = New-Object System.Security.AccessControl.FileSystemAccessRule($Username, $permissions, $allInherit, $allPropagation, "Allow") 
    if ($acl.Access | Where { $_.IdentityReference -eq $Username}) 
    { 
     $accessModification = New-Object System.Security.AccessControl.AccessControlModification 
     $accessModification.value__ = 2 
     $modification = $false 
     $acl.ModifyAccessRule($accessModification, $AR, [ref]$modification) | Out-Null 
    } 
    else 
    { 
     $acl.AddAccessRule($AR) 
    } 
    Set-Acl -path $Path -AclObject $Acl 
} 
Các vấn đề liên quan