読者です 読者をやめる 読者になる 読者になる

Knowlbo 開発者ブログ

株式会社Knowlboの開発者ブログです。

構成ファイル(config)へアクセスする際のパフォーマンス

開発部の緒方です。本日は開発メモです。

アプリケーションは、構成ファイル(config)で設定を変更できるようにします。
構成ファイルへのアクセスは当然ファイルI/Oが発生するため、都度読み込むとパフォーマンスが悪くなります。

そのため、起動時や最初のアクセス時に構成ファイルの内容をキャッシュするのが常套手段なのですが、.Net Frameworkの標準的な下記のクラス、メソッドを利用すると、この処理を自動で行ってくれます。

System.Configuration.ConfigurationManager.AppSettings

このクラス、メソッドを利用していれば、パフォーマンスの心配をする必要はありません。
もちろん、マルチスレッド対応です。

フレームワークらしい、素晴らしい実装ですね。

ドメインアカウントで Windows にログインできなくなった時にやること

開発部の本橋です。 今回は社内情シス的な Tips です。

ドメインアカウントで突然 Windows にログインできなくなる

ドメインに参加しているPCにログインしようとすると以下のようなメッセージが表示されログインできなくなってしまうことがあります。

このワークステーションとプライマリドメインとの信頼関係に失敗しました

滅多に遭遇することはないんですが、アカウントのパスワードを変更した直後に起こりやすいような気がします。

Microsoft 公式の KB2771040 にもあるように、一旦ドメインから抜けてもう一度参加しなおせば良いのですが、管理者グループに入ったローカルアカウントがないとできません。

キャッシュされた資格情報を利用する

スタンドアロンの Windows はキャッシュされた資格情報を利用してログインできますので*1、この仕組みを利用して復旧します。

  1. LANケーブルを抜く。
  2. ドメインのアカウント名とパスワードを入力する。
    • この時、パスワードを変更した直後の場合は変更前のパスワードを入力する。
  3. ローカルアカウントを作成し、管理者グループに追加する。
    • またはローカル administrator を有効化する。
  4. 一度ログアウトし、作成したローカルアカウントでログインする。
  5. ドメインから抜ける。
  6. LANケーブルを繋ぐ。
  7. ドメインにもう一度参加する。

これで通常通りドメインアカウントでPCにログイン出来るようになります。

*1:これを無効にしている場合はお手上げですが・・・

PowerShell スクリプトで気をつけたいこと その2

開発部の本橋です。先日投稿した PowerShell スクリプトで気をつけたいこと の続編です。

親スコープの変数を子スコープのブロックから書き換えたい

スクリプト言語にはよくある話ですが、親スコープに存在する変数を書き換える際に気をつける必要があります。

そもそも PowerShell のスコープには次の5種類があります。*1

  • Global
    • その名の通りグローバルスコープです。スクリプトファイル外からでも参照可能です。
  • Local
    • カレントのスコープです。子スコープからも参照可能です。
  • Script
    • 同一スクリプトファイルの中でのみ参照可能です。
  • Private
    • カレントスコープでのみ参照可能です。
  • Numbered Scopes
    • カレントブロックからの相対数を指定してスコープを参照します。

何も考えずに変数を定義すると Local スコープになります。以下はうまくいかない例です。

# このスコープに変数 $a を定義 (Local スコープ)
$a = 'A'

# スクリプトブロックを定義して子スコープを作る
$fn = {
    Write-Host $a # ==> A

    # 親スコープの変数 $a を書き換えたつもりだが、
    # このスコープに変数 $a を定義 (Local スコープ)
    $a = 'B'

    Write-Host $a # ==> B
}

# スクリプトブロックを呼び出し
& $fn

# このスコープの $a は書き換わっていない
Write-Host $a # ==> A

$a をスクリプトブロックの中で書き換えたつもりでも、スクリプトブロックを抜けると $a はもとに戻ってしまいます。コメントにも書きましたが、$fnLocal スコープに $a を定義してしまっているためです。

この場合、スコープを指定して $a に代入します。

# このスコープに変数 $a を定義 (Local スコープ)
$a = 'A'

# スクリプトブロックを定義して子スコープを作る
$fn = {
    Write-Host $a # ==> A

    # 1つ上のスコープを指定して変数 $a を書き換える
    Set-Valiable -Name a -Scope 1 -Value 'B'

    # もしくは Script スコープの変数 $a を定義する
    #$script:a = 'B'

    Write-Host $a # ==> B
}

# スクリプトブロックを呼び出し
& $fn

# $a は書き換わっている
Write-Host $a # ==> B

Set-Variable コマンドレットで一つ上のスコープを指定して変数の値を書き換えてあげればうまくいきます。また、上記コメント中に書いたように $script:a = 'B'とすると Script スコープの変数に代入する形になります。意図しない上書きをしてしまう場合があるので気をつけましょう。