2020-04-24


 テレビでも良く宣伝をしている某社が納品したPowerShellスクリプトで凄いbugを発見。
 どうも作成者はWindows外部コマンドとPowerShell cmdletとを等価に扱っている様で、cmdletのファイル削除エラーを$LASTEXITCODEで拾えると思ったらしい。他の個所のWindows外部コマンド.exe起動後エラー判定も、同一処理としている。

 ErrorActionPreferenceは設定されていないので、この処理でエラーが発生すると一般的にはContinueされて#エラー判定 以降に進むのだがエラーがキャッチされる事は無い。

 PowerShellではエラーをtry{} catch[exception]{}で判定する必要があるのだが、他のスクリプトにも一切出現していない事から見て、根本的な理解誤りの様だ。
 cmdletで実際にエラーを起こすのは難しい場面もあるが、テストを良く通過したなと思った。
  この会社の「お任せあれ」は怪しいな。

 なお、筆者ならファイルの属性変更して削除できなくしてわざとエラーを起こす等でテストします。
  

  Get-ChildItem $Logs -Recurse -include *.log | Where-object{((Get-Date) – $_.LastWriteTime).Days(後略)   
    #エラー判定
    if($LASTEXITCODE -ne 0)
    {
        "正常に終了しました。"

2020-04-18

 Windowsの予約語を含むフォルダ、ファイルは作成できないと思っていたが、\\.\をパス先頭に付加すると作成できるとの事。
 Windowsサービス機能無効\\?\と似ているが違う様子。
 これで作成したフォルダへアクセスすると「ハンドルが無効です」となる。削除はrmdirで可能。

https://hirahira-net.com/2017/10/26/post-337/

c:\workにconというフォルダを作りたい場合は、
mkdir \\.\c:\work\con
ファイルを作成するためには
copy nul \\.\c:\work\con

 例えばUNIX-Windowsでファイル共有をした時にWindows側でどのように予約語が処理されるか。
 アンダースコアが付与されて処理される。

https://www.too.com/support/faq/mac/finder_os/23555.html



https://www.ipa.go.jp/security/awareness/vendor/programmingv1/b08_01.html

https://all.undo.jp/asr/1st/document/01_03.html
PS C:\WINDOWS\system32> Find-PackageProvider
警告: URI 'https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409' から '' へダウンロードできません。
警告: 利用可能なプロバイダーの一覧をダウンロードできません。インターネット接続を確認してください。

1. Open Powershell (As Admin)
2. [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
3. Try it again!


https://answers.microsoft.com/en-us/windows/forum/windows_7-performance/trying-to-install-program-using-powershell-and/4c3ac2b2-ebd4-4b2a-a673-e283827da143

2020-04-06

 現在作成中のFileMaintenaceで備忘録。

 PowerShellは変数の型指定は必須ではない。が、判読性の観点で極力型指定をしていた。functionのParam()で[Boolean]指定時の留意点。


 FileMaintenanceではfunctionの呼び出しで呼び出し毎に引数を全て指定していない。スクリプト全体で指定しているもの(定数と考えて良い)は、上位のスコープから落ちてくるのでParamで特段指定をする必要がないため。
 しかしながらfunctionの判読性の観点では何が入力になっているのかが判る方が良い。そのため、スクリプト全体用に定義しているものは以下例で言うところの$GlobalSwitch,$GlobalValueの様に引数として必須ではないが、定数として使用しているのが判りやすい様に記述してみた。


 ここで、[int]は良いのだが、[Boolean]に落とし穴がある。[Boolean]は$NULLを許容しないので、値を定義していないとエラーになってしまう。$TRUE,$FALSE,数値のみを受け入れる。
 特定の状況のみで必要なフラグなどでは未定義状態の場合があるため、これは問題である。仕方がないので、[Boolean]だけは型指定をしない実装としておく、


Param(
[String]$Name ,

[int]$GlobalValue = $GlobalValue
[Boolean]$GlobalSwitch = $GlobalSwitch
)

2020-04-05


 CiTRiX XenAPPの構築で発生した事象の備忘録。
 正当に取得したライセンスファイルを追加したところ、以下の警告が出力されてライセンス追加が出来ない。
 試行したところ、ChromeブラウザでダウンロードしたものはNGだが、IEブラウザで取得したものはOK。

「選択されたファイルのバイトオーダーマークが正しくないため、CiTRiXライセンスファイルとして無効です」

2020-03-29

 プログラム歴を振り返ると、太古の時代に触れたPC-8001に搭載されていてたN-BASICとZ80のアセンブラが原体験である。その後長年に渡ってプログラミングと縁は殆ど無かったのである。
 大学時代にFORTRANの授業はあったが、体系的に勉強した訳ではない。

 その経歴を踏まえると、現代に生きる筆者がオブジェクト指向を理解せずにPowerShellでプログラミングしても誰が責めようか。

 そして、何となくオブジェクト指向の存在に気付き、GitHubで公開中のFileMaintenanceの致命的な基本設計ミスが遂に修正された。今まで対象ファイル(フォルダ)の処理ループ内では対象をパス文字列として扱っていたのであるが、これをオブジェクトとして各種パス情報はオブジェクトのプロパティとして取り出す事にした。
 今にして見返せば、お手本では正しくオブジェクト指向で設計実装されていたのだが、理解不測の筆者は何故かパスのStringだけを取り出して処理する実装をしていたという馬鹿さ加減に先日までの自分を殴ってやりたい気分である。

 OOPの深淵にちょっとだけ近づいた!

2020-03-16

備忘録。

arcserve UDPはWindows VSSと連携して一貫性のあるバックアップを取得する。
Windows VSSとOracle VSS Writerとは連携して動作するのだが、VSS動作時に以下の様なエラーが出力される。

この原因はOracle Databaseの起動ユーザが
SYSTEM\CurrentControlSet\Services\VSS\Diag
に対して権限を保有していないため。

上記キーに対して、Oracle起動ユーザへアクセス権フルコントロールを付与する

ボリューム シャドウ コピー サービス エラー: ルーチン RegOpenKeyExW(-2147483646,SYSTEM\CurrentControlSet\Services\VSS\Diag,...) の呼び出し中に予期しないエラーが発生しました。hr = 0x80070005, アクセスが拒否されました。

自己紹介

自分の写真
東京都, Japan
憂鬱な凍死家です。こちらではmixiとは異なり固めの話題中心です。

Total Page View

Categories

Powered by Blogger.

Popular Posts

Blog Archive