2012-03-16 9 views
2

私は書き込みアクセス権を共有しています。私はその共有にログファイルを書き込むためのPowerShellスクリプトを書いています。共有に書き込みアクセス権があるかどうかを確認する方法は?

私は、この共有に書き込みをする前に、この共有への書き込みアクセス権を持っているかどうかを確認したいと思います。

powershellを使用して書き込みアクセス/フルコントロールをチェックする方法は?

私はGet-ACLコマンドレットを試しました。

$Sharing= GEt-ACL "\\Myshare\foldername 
    If ($Sharing.IsReadOnly) { "REadonly access" , you can't write" } 

これは、IsReadOnlyプロパティを持っていますが、ユーザーがフルコントロールのアクセス権を持っていることを確認する方法はありますか?

+0

何か試しましたか?あなたの問題を解決するための少しの努力を示し、コミュニティがあなたを助けます。 –

+0

@Christian:Buddy質問で私の努力を更新しました。 – Samselvaprabu

+0

Sysinternalsの[AccessChk](http://technet.microsoft.com/en-us/sysinternals/bb664922)を使用できます。もう1つのオプションは、呼び出された同じAPIを呼び出すWin32関数['GetEffectiveRightsFromAcl'](http://msdn.microsoft.com/en-us/library/aa446637%28v=vs.85%29.aspx)を使用することですファイル/フォルダのプロパティの[有効なアクセス許可]タブを使用する場合しかし、これはPowerShellで実装するのがはるかに複雑です。 –

答えて

6

これは、C#をコンパイルせずに@ ChristianのC#と同じことを行います。私はそれがより良い質問にお答えしますので、PowerShellでGetEffectiveRightsFromAclの実施を検討したいと思います

function Test-Write { 
    [CmdletBinding()] 
    param (
     [parameter()] [ValidateScript({[IO.Directory]::Exists($_.FullName)})] 
     [IO.DirectoryInfo] $Path 
    ) 
    try { 
     $testPath = Join-Path $Path ([IO.Path]::GetRandomFileName()) 
     [IO.File]::Create($testPath, 1, 'DeleteOnClose') > $null 
     # Or... 
     <# New-Item -Path $testPath -ItemType File -ErrorAction Stop > $null #> 
     return $true 
    } catch { 
     return $false 
    } finally { 
     Remove-Item $testPath -ErrorAction SilentlyContinue 
    } 
} 
Test-Write '\\server\share' 

....

+0

は、コマンドレットだけでなく、.netクラスも使用しています。 –

+0

とは何ですか?[ValidateScript({[IO.Directory]::Exists($ _。FullName) })] [IO.DirectoryInfo] $パス。 ? –

+0

@Christian ISE/PowerGUIでデバッグできない2)構文の強調表示/コード補完がありません。3)PowerShellとは構文規則が異なります。私は[ビットシフト](http://msdn.microsoft.com/en-us/library/aa691377(v)など、PowerShellがネイティブに実行できない機能(cmdlets、.NETクラス)を実装するためにC#を埋め込むことをお勧めします= vs.71).aspx)または[P/Invoking](http://msdn.microsoft.com/en-us/library/aa446536.aspx)を参照してください。 –

2

は、私は、現在のユーザがパスへの書き込みアクセス権を持っているかどうかを確認するために、この方法を使用します。

# add this type in powershell 

add-type @" 
using System; 
using System.IO; 

public class CheckFolderAccess { 

public static string HasAccessToWrite(string path) 
     { 
      try 
      { 
       using (FileStream fs = File.Create(Path.Combine(path, "Testing.txt"), 1, FileOptions.DeleteOnClose)) 
       { } 
       return "Allowed"; 
      } 
      catch (Exception e) 
      { 
       return e.Message; 
      } 
     } 

} 
"@ 

# use it in this way: 

if ([checkfolderaccess]::HasAccessToWrite("\\server\share") -eq "Allowed") { ..do this stuff } else { ..do this other stuff.. } 

コードACLをチェックしませんが、ちょうどそれが可能である場合、パスにファイルを書き込むことができる場合文字列 'allowed'を返します。それ以外の場合は、例外のメッセージエラーを返します。

+0

C#を使用せずにPowerShell関数にしてみませんか? –

+0

私のボックスには、$ profileにロードされたカスタムモジュールによってタイプが追加されています。 –

+0

がリロードされた場合に--IgnoreWarnings関数を追加することは可能です。純粋なPowerShellで関数を作成することを考えていただけです。実際にC#を必要とするものはありません。 –

0

は、ここで私が構築された非常に単純な機能です。 "読み取り"、 "書き込み"、 "ReadWrite"、 ""(アクセス不可)を返します。

function Test-Access() 
{ 
    param([String]$Path) 
    $guid = [System.Guid]::NewGuid() 
    $d = dir $Path -ea SilentlyContinue -ev result 
    if ($result.Count -eq 0){ 
     $access += "Read" 
    } 
    Set-Content $Path\$guid -Value $null -ea SilentlyContinue -ev result 
    if ($result.Count -eq 0){ 
     $access += "Write"; 
     Remove-Item -Force $Path\$guid 
    } 
    $access 
} 
関連する問題