2013-01-23 24 views
15

Tôi đang làm việc với PowerShell, chạy một kịch bản (từ giao diện điều khiển của tôi) trong đó bao gồm dòng này:Tôi cần giúp đỡ để hiểu các vấn đề bảo mật truy cập PowerShell và tập tin

$inpath = "C:\users\xxxxx\path\foo\bar" 

và tôi tiếp tục nhận được lỗi này:

Get-Content : Access to the path 'C:\users\xxxxx\path\foo\bar' is denied. 
At C:\users\xxxxx\path\foo\testscript.ps1:53 char:12 
+ Get-Content <<<< $txtfile | Get-WordCount -Exclude (Get-Content c:\temp\exclude.txt) | select -First 15 
    + CategoryInfo   : PermissionDenied: (C:\users\xxxxx\path\foo\bar:String) [Get-Content], UnauthorizedAcc 
    essException 
    + FullyQualifiedErrorId : GetContentReaderUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetContentCommand 

Tất cả tập lệnh và tệp đích đều nằm trên ổ đĩa cục bộ của tôi. Tôi có thể truy cập các tệp trong Explorer, xem/chỉnh sửa/lưu chúng bằng cách sử dụng NotePad và không có bất kỳ hạn chế quyền nào được đặt. Khi tôi đang ở trên dòng lệnh, tôi có thể chạy lệnh ghép ngắn get-content thành công trên các tệp trong đường dẫn của tôi. Tôi có thể thay đổi các thư mục PS C:> cd C:\users\xxxxx\path\foo\bar và liệt kê danh sách thành công ở đó. Thậm chí thú vị hơn, tôi có thể nhân đôi dòng đó là lỗi trong kịch bản, và không nhận được một lỗi trên dòng lệnh.

PS C:\users\xxxxx\path\foo> $inpath = "C:\users\xxxxx\path\foo\bar" 
PS C:\users\xxxxx\path\foo> 

Điều này khiến tôi nghi ngờ rằng lỗi 'Bị từ chối' thực sự là điều gì đó khác, hoặc điều gì đó mơ hồ đến mức tôi không biết cách xử lý khắc phục sự cố. Có thể cho PS có các quyền khác với người dùng mà nó đang chạy không? Có ai đã từng xem hành vi này trước đây không và bạn đã giải quyết vấn đề như thế nào? Tôi chắc rằng có một giải pháp đơn giản mà tôi không biết.

+0

Làm thế nào bạn có đang chạy kịch bản và với những gì cho phép? Một công việc trong Task Scheduler? Tập lệnh có hoạt động nếu bạn gọi tập lệnh từ bảng điều khiển không? –

+0

Bạn đang cố gắng đọc tệp nào? (Nó hoàn toàn có thể có quyền truy cập vào một thư mục nhưng không phải là tệp chứa.) – Richard

+0

@Graimer - tập lệnh đang chạy từ bảng điều khiển; không chắc chắn về các quyền mà tập lệnh có, cách tìm hoặc cách đặt chúng nếu chúng khác với quyền người dùng của tôi. Nó không hoạt động từ giao diện điều khiển AS A SCRIPT (ví dụ: PS c: \ foo>. \ Script.ps1), nhưng nó hoạt động nếu tôi gõ dòng riêng lẻ làm dấu nhắc giao diện điều khiển. – dwwilson66

Trả lời

23
Get-Content : Access to the path 'C:\users\xxxxx\path\foo\bar' is denied. 
At C:\users\xxxxx\path\foo\testscript.ps1:53 char:12

Đường dẫn đó không giống như tệp nhưng thư mục.

Bạn có chắc là bạn đang thêm tên tệp vào thư mục và chuyển nó tới Get-Content?

Windows cho phép Truy cập bị từ chối khi bạn thử và mở một thư mục như thể đó là một tệp mà không vượt qua các cờ bổ sung; và .NET không vượt qua những lá cờ đó (có một vài trường hợp cụ thể để mở một thư mục, nhưng chúng không áp dụng ở đây).

+0

Bạn đang sửa, '$ inpath' là đường dẫn. Tập lệnh đang sử dụng 'foreach' với đường dẫn ...' foreach ($ doc in $ inpath {do-function}) '. Tôi đã tái chế mã này từ một tập lệnh trước hoạt động hoàn hảo ... - dwwilson66 – dwwilson66

+0

@ dwwilson66: Tôi không nói về biến: * nhìn vào thông báo lỗi *, đường dẫn nó hiển thị là đường dẫn được chuyển đến 'Nhận -Content' và không thể mở được. – Richard

0

Thay vì điều này: (theo nhận xét của bạn)

foreach ($doc in $inpath) { do-function } 

thử điều này:

foreach ($doc in (gci $inpath)) { do-function } 

Bạn đang làm một foreach trên một đối tượng chuỗi thay vì mục thư mục của bạn.

3

Nội dung đọc nội dung của tệp không phải thư mục. Vui lòng thêm . sau đường dẫn thư mục của bạn như dưới đây.

Get-Content "D:\Logs\*.*" | ?{($_|Select-String "test")} 

Nếu bạn muốn đi qua tất cả các thư mục cách dưới nó sau đó thêm -recurse như dưới đây:

Get-Content "D:\Logs\*.*" -Recurse | ?{($_|Select-String "test")} 
+0

Không có tham số -Recurse cho Get-Content – dzampino

Các vấn đề liên quan