ページ

ラベル PowerShell の投稿を表示しています。 すべての投稿を表示
ラベル PowerShell の投稿を表示しています。 すべての投稿を表示

2007-07-31

PowerShellでファイルのアクセス権を設定する

Windowsで大量のファイルにアクセス権を設定してまわるときの話。
CACLSコマンドでちまちまと設定していってもいいのですが、PowerShellを使うとアクセス権をコピーすることができます。
 
まず1つのフォルダにアクセス権を設定しておて Get-Aclでアクセス権を取得 Set-Aclで設定という流れになります。
$acl = Get-Acl -Path "アクセス権の設定元パス"
Set-Acl -AclObject $acl -Path "アクセス権の設定先パス"
 
本来はこんなことをしなくて済むフォルダ構成にすべきなのですが...。
 

2007-07-12

PowerShell実行ポリシーの謎

Windows PowerShellのスクリプトをファイルに保存して実行しようとするとエラーになります。
スクリプトの実行がシステムで無効になっているため、ファイル D:\test.ps1 を読み込めません。詳細については、「get-help abut_signing」と入力してヘルプを参照してください。
発生場所 行:1 文字:10
+ ./test.ps1 <<<<
 
親切なメッセージに従ってヘルプを参照してみます。
> help about_signing

     :

Restricted
    - 既定の実行ポリシーです。
    - 個々のコマンドは許可されますが、スクリプトは実行できません。

AllSigned
    - スクリプトを実行できます。
    - ローカル コンピュータ上で作成されたスクリプトも含めて、すべての
      スクリプトと構成ファイルに対して、信頼された発行元によるデジタル
      署名が必要です。
    - 信頼された発行元からのスクリプトを実行する前に、プロンプトが表示
      されます。
    - 署名されてはいても、悪意のあるスクリプトを実行するおそれがあります。

RemoteSigned
    - スクリプトを実行できます。
    - インターネットからダウンロードされたスクリプトおよび構成ファイル
      (電子メール プログラムとインスタント メッセージング プログラムを
      含みます) に対して、信頼された発行元によるデジタル署名が必要です。
    - ローカル コンピュータから実行されるスクリプトに対してデジタル署名
      を要求しません。
    - 信頼された発行元からのスクリプトを実行する前に、プロンプトは表示
      されません。
    - 署名されてはいても、悪意のあるスクリプトを実行するおそれ
      があります。

Unrestricted
    - 署名なしスクリプトを実行できます。
    - インターネットからダウンロードされたスクリプトおよび構成
      ファイル (Microsoft Outlook、Outlook Express、および Windows
      Messenger を含みます) を、インターネットから入手されたファイル
      であることを警告してから実行します。
    - 悪意のあるスクリプトを実行するおそれがあります。
     :
 
つまり標準のRestrictedのままだとスクリプトは一切実行できません。
 
「自分の責任でポリシーを変更せよ」ということですね。
なかなか慎重な初期設定ですね。
 
Unrestrictedは何でもありのようですが、さすがに緩めすぎのような気がするのでRemoteSignedに変更します。
> Set-ExecutionPolicy Unrestricted
> ./test.ps1
これで無事に実行できました。
 
でも、ここで疑問が、
「インターネットからダウンロードされたスクリプト」というのは何でしょうか?
 
試しに.ps1をPowerShellに関連付けしてみます。
フォルダオプションから拡張子ps1を見つけます。
デフォルトはメモ帳になっているのですね。
 
[詳細設定]ボタンを押して「ファイルの種類の編集」画面を出します。
[新規ボタン]で「新しいアクション」画面を出します。
アクション名を「実行」
アクションを実行するアプリケーションを 「"C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -noexit "%1"」とします。
noexitオプションについてはここを参考にしました。
 
ところが、この状態でWeb領域のスクリプトをクリックしてみても普通に実行されてしまいました。
RemoteSignedが署名を要求するのはどのような場合なのでしょうか...?
 

2007-07-10

PowerShellで進捗状況を表示させる

Windows PowerShellで時間のかかる処理をするとき、 Write-Progressを使うと進捗状況を表示することができます。
// 100MB以上のファイルを表示してみる
$path      = "<フォルダ名>"
$fileCount = (Get-ChildItem -recurse $path).Length
$counter   = 0

foreach ($file in Get-ChildItem -recurse $path) {
    $counter ++;
    Write-Progress -activity "FileSerch" -status "Now Serching ..." -percentComplete ($counter / $fileCount * 100)
    
    if ($file -is [IO.FileInfo]) {
        if ($file.Length -gt 100000000) {
            Write-Output ([String]::Format("{0}({1})", $file.FullName, $file.Length))
        }
    }
}
 
これだけでコンソールにプログレスバーが表示されます。
なかなか便利な機能ですね。
 
ただし日本語がちょっと微妙な表示になりますが...。