知識は未だ霧の中

スパコン眼鏡NET。HPCのことはあまり書かない。

PowerShellに署名をつける

自己署名証明書の作成と設定

MyCertという名前で証明書を作成し、RootとTrustedPublisherに証明書を追加します。 また、デスクトップに、MyCert.cerという名前でエクスポートします。

なお、ユーザー証明書ではなく、システム証明書として登録する場合は、cert:\CurrentUser\をすべてcert:\LocalMachine\に置き換えてください。

$CertName = "MyCert"
$CertPath = "${env:userprofile}\Desktop\$CertName.cer"
$Cert = New-SelfSignedCertificate `
    -Type CodeSigningCert `
    -CertStoreLocation "cert:\CurrentUser\My" `
    -Subject $CertName `
    -KeyAlgorithm RSA `
    -KeyLength 2048 `
    -KeyExportPolicy Exportable `
    -NotAfter (Get-Date).AddYears(1).AddMonths(6)
Get-ChildItem -Path "cert:\CurrentUser\My\" | Where-Object {$_.Subject -eq "CN=$CertName"} | Export-Certificate -FilePath $CertPath -Type CERT
Import-Certificate -FilePath $CertPath -CertStoreLocation "cert:\CurrentUser\Root"
Import-Certificate -FilePath $CertPath -CertStoreLocation "cert:\CurrentUser\TrustedPublisher"

PowerShellスクリプトへの署名

先ほど作成したMyCertでscript.ps1というPowershellスクリプトに署名を行います。

注意点として、同名の証明書が複数ある場合は、下記のスクリプトで適切な証明書が選択できないため、Certification Managerから対象の証明書のFingerPrintを調べ、Set-AuthenticodeSignatureコマンドで署名を行ってください。

$CertName = "MyCert"
$ScriptPath = "script.ps1"
$Cert = Get-ChildItem -Path "cert:\CurrentUser\My\" | Where-Object {$_.Subject -eq "CN=$CertName "}
Set-AuthenticodeSignature $ScriptPath $Cert

テスト

ポリシーをAllSignedにしたPowershellのプロセスでスクリプトが実行されることを確認します。 動作すれば署名が正しくできています。

$ScriptPath = "script.ps1"
powershell -ExecutionPolicy AllSigned $ScriptPath 

他の環境での実行

エクスポートした証明書をRootとTrustedPublisherにインポートしてください。 証明書を対象のマシンにコピーしてGUI、もしくは下記のコマンドでインポート可能です。

$CertPath = "MyCert.cer"
Import-Certificate -FilePath $CertPath -CertStoreLocation "cert:\CurrentUser\Root"
Import-Certificate -FilePath $CertPath -CertStoreLocation "cert:\CurrentUser\TrustedPublisher"

Powershellでレジストリ上の"UTF16LEのバイト列"と文字列の相互変換を行う。

目的

レジストリに書かれているUTF16LEのバイト列を文字列と相互変換する。

方法

バイト列から文字列に変換する関数。

function REGUTF16LEByte2String(){
    param(
        [string][parameter(mandatory)] $String
    )
    $arry = $String.split(',') | ForEach-Object {[convert]::ToByte($_, 16)}
    return [System.Text.Encoding]::Unicode.GetString($arry)
}

文字列からバイト列に変換する関数。

function String2REGUTF16LEByte(){
    param(
        [string][parameter(mandatory)] $String
    )
    return ([System.Text.Encoding]::Unicode.GetBytes($String) | ForEach-Object {$_.ToString("X2")}) -join ","
}

使い方

PS > $a = String2REGUTF16LEByte "hoge"
PS > $a
68,00,6F,00,67,00,65,00
PS > REGUTF16LEByte2String $a
hoge

まとめ

便利。

Powershellでアクセス権限を確認する

やりたいこと

ディレクトリに特定のアクセス権限があるかどうかを確認したい。 (とりあえずファイルを書いてみて、エラーが発生するかどうか確認すればよいとか言ってはいけない。)

コード

Test-Permissionという関数を作成しました。 一つ目の引数にパス、二つ目の引数にユーザー名、三つ目に確認したい権限の種類 [System.Security.AccessControl.FileSystemRights] を記載します。

function Test-Permission() {
    param(
        [string][parameter(mandatory)] $Path,
        [string][parameter(mandatory)] $User,
        [System.Security.AccessControl.FileSystemRights][parameter(mandatory)] $Right
    )
    $acl = (Get-ACL $Path).Access;
    $allow = $acl | Where-Object {$_.IdentityReference -match $User -and $_.AccessControlType -match "Allow"}  | ForEach-Object {$t = $False} {$t = (($_.FileSystemRights -band $Right) -eq $Right) -or $t} {$t}
    $deny =  $acl | Where-Object {$_.IdentityReference -match $User -and $_.AccessControlType -match "Deny"}  | ForEach-Object {$t = $False} {$t = (($_.FileSystemRights -band $Right) -eq $Right) -or $t} {$t}
    return $allow -and -not $deny    
}

上記の関数を用いて、$pathに対して、$usernameが編集の権限を持っているかを確認する場合は、 次のようなコードとなります。

Test-Permission $path $username Modify

既知の問題点

SMBなど、リモートのディレクトリに関しては正しく動作しません。 ローカル環境ではリモートのSIDから名前を検索することができないためです。 AD環境ではADモジュールを、ワークグループ環境ではNetBIOSを使えば解決できるかと。

(気が向いたら追記するかもしれません。)

Windows10の設定の手動プロキシ セットアップが正しく動いていない件とその対応

問題

Windows10の設定の手動プロキシ セットアップ (Manual proxy setup)が(条件によって?)正しく動いていない件

環境

Windows 10 (大分昔のバージョンから。もしかしたら最初からかも)

背景

以前のWindowsではプロキシの設定はInternetExprolerから設定するのがよくある方法だったと思う。

Internet Option -> Local Area Network (LAN) Settings の Proxy serverから

f:id:hrontan:20210122211623p:plain

"User a proxy server for your LAN (These settings will not apply to dial-up or VPN connections)" をオンにする。

f:id:hrontan:20210122211641p:plain

さらに、Socksプロキシなどを使っている場合は Advancedから 下記画像のような設定を行う。 sshのDynamic Proxyを使っているケースではこのような設定をすることになるだろう。 (なお、例ではSocksのプロキシサーバーをlocalhostの8080番ポートで動かしている)

f:id:hrontan:20210122211702p:plain

Windows 10でも上記の方法は正しく動くのであるが、サポートが終わるIEを使い続けるのもよろしくない。

現象

上記のような場合、Windows 10 の標準機能で対応するものは 設定 -> ネットワークとインターネット -> プロキシ の画面である。

f:id:hrontan:20210122212013p:plain

IEでの設定と同じもの設定の表記は図の様に、

となる。

これで問題なく動いているように思われる… が、実はここに大きな問題がある。

問題その①

設定を編集できない。

例えば、ポートを8080から8081に変更して保存しても、再度設定画面を開くと元に戻ってしまっているのだ。 保存ボタンが動いていないようだ。。。

問題その➁

トグルスイッチでプロキシをオフにはできるが、オンにはできない。

プロキシの設定をオン -> オフにすると無事に通信がプロキシ経由でなくなる。 一方、オフ -> オンにしても、再度設定画面を開くと元に戻ってしまっている。もちろんプロキシは有効になっていない。

解決策1

上記の設定は、

Computer\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings

  • ProxyServer (RED_SZ)
  • ProxyEnable (REG_DWORD)

のキーに保存されている。

例の設定だと、"ProxyServer"は"socks=localhost:8080" となり、Proxyのオン/オフはProxyEnableの1/0の対応している。

なので、下記の二つのファイルを用意する。

ProxyEnable.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyEnable"=dword:00000001

ProxyDisable.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyEnable"=dword:00000000

上記のファイルをそのまま実行する場合、無意味に管理者権限を要求されるため(今回は管理者権限が不要な範囲の書き換えしか行っていないため)、次のコマンドでファイルを読み込む

プロキシを有効にしたいとき

ProxyEnable.bat

reg import ProxyEnable.reg 

プロキシを無効にしたいとき

ProxyDisable.bat

reg import ProxyDisble.reg 

解決策2

オシャレにPowershellで解決したい場合

ProxySetting.ps1

param(
    [switch] $Enable,
    [switch] $Disable
)
if ($Enable -ne $Disable){
    Set-ItemProperty -LiteralPath  'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings' -Name 'ProxyEnable' -Value ([int]$Enable.IsPresent)
}else{
    Write-Output "Parameter Error"
}

プロキシを有効にしたいとき

powershell -file .\ProxySetting.ps1 -Enable

プロキシを無効にしたいとき

powershell -file .\ProxySetting.ps1 -Disable

雑感

プロキシの設定に関するバリデーションが間違っているのだろうな。と推測。 プロキシ設定を有効にする際や設定の保存を行う際に、"設定"が入力された文字をチェックして、未対応の場合はエラーも出さずに処理を破棄してしまっているのかと。そのうち直してくれるといいなぁという気持ち。

Powershellでアクセス権限を確認する方法

目的

PowerShellでアクセス権限をかっこよく確認したい。

プログラムを書いていて、事前にファイルを変更するアクセス権限があるか確認したいなぁと思いました。
とりあえず、書き込いてみてエラーをハンドリングするというのも手なのですが、アクセス権限だけを確認したいときはスマートではないと感じます。(感じてください)

ということで作成しました。

環境

PowerShell 5.1 で動作確認。(ほかのバージョンも動くと思うんですが、保証はしません)

中身

function Test-Permission() {
    param(
        [string][parameter(mandatory)] $Path,
        [string][parameter(mandatory)] $User,
        [System.Security.AccessControl.FileSystemRights][parameter(mandatory)] $Right
    )
    $acl = (Get-ACL $Path).Access;
    $allow = $acl | Where-Object {$_.IdentityReference -match $User -and $_.AccessControlType -match "Allow"}  | ForEach-Object {$t = $False} {$t = (($_.FileSystemRights -band $Right) -eq $Right) -or $t} {$t}
    $deny =  $acl | Where-Object {$_.IdentityReference -match $User -and $_.AccessControlType -match "Deny"}  | ForEach-Object {$t = $False} {$t = (($_.FileSystemRights -band $Right) -eq $Right) -or $t} {$t}
    return $allow -and -not $deny    
}

使い方

C:\hogeフォルダのmynameユーザーに変更権限があるかどうか確認したい時は、

Test-Permission "C:\hoge" "myname" Modify

みたいな感じです。
3つ目の変数はSystem.Security.AccessControl.FileSystemRights列挙体の変数を取ります。ReadとかWriteとかModifyとか…。詳しくはこちら

解説

Get-ACLで対象のオブジェクトのアクセスコントロールリストを取得し、該当ユーザーに関する許可リストと拒否リストをそれぞれ抽出し、該当する権限がそれぞれに載っているかを確認し、集約してます。
(ちなみにFileSystemRightsはビットフィールドで管理されています。へー。)
許可リストに載っていて、拒否リストに載っていなかったらTrueを、それ以外はFalseを返します。

Windows Sandboxのセキュアな設定

目的

Windows Sandboxをより安全に、快適に使ってみる。 (ためのconfigのメモ)

必要な環境 (公式より抜粋)

  • Windows 10 Pro or Enterprise Insider build 18305 or later
  • AMD64 architecture
  • Virtualization capabilities enabled in BIOS
  • At least 4GB of RAM (8GB recommended)
  • At least 1 GB of free disk space (SSD recommended)
  • At least 2 CPU cores (4 cores with hyperthreading recommended)

なお、Windows サンドボックスを有効化すると100MBほどディスク容量を使います。

インストール手順

  1. Windows FeaturesからWindows Sandboxを選択し、インストール、再起動。
  2. config.wsbファイルを好きな場所(デスクトップなど)作成("{ユーザー名}"は自身のユーザー名に置き換えてください。) なお、デフォルトの設定で起動するのであれば、configファイルは作成しなくともよいです。
<Configuration>
   <VGpu>Enable</VGpu>
   <Networking>Disable</Networking>
   <AudioInput>Disable</AudioInput>
   <VideoInput>Disable</VideoInput>
   <ProtectedClient>Enable</ProtectedClient>
   <PrinterRedirection>Disable</PrinterRedirection>
   <ClipboardRedirection>Disable</ClipboardRedirection>
   <MappedFolders>
      <MappedFolder>
         <HostFolder>C:\Users\{ユーザー名}\Downloads</HostFolder>
         <SandboxFolder>C:\Users\WDAGUtilityAccount\Downloads</SandboxFolder>
         <ReadOnly>true</ReadOnly>
      </MappedFolder>
   </MappedFolders>
   <LogonCommand>
      <Command>explorer.exe C:\Users\WDAGUtilityAccount\Downloads
      </Command>
   </LogonCommand>
</Configuration>

config.wsbでは、下記を設定

  • パフォーマンス向上のため仮想GPUをオン
  • セキュリティ強化のためネットワーク/ビデオ入力/オーディオ入力/プリンタリダイレクト/クリップボードをオフ (クリップボードをオフにしているのでホスト-ゲスト間でコピペができません。)
  • セキュリティ強化のためProtectedClientをオン(RDPの機能制限を行っている模様)
  • 利便性向上のため、ダウンロードフォルダを読み取りのみでサンドボックス内のダウンロードフォルダにマウント

利用方法

  1. config.wsbをダブルクリックで起動。(サンドボックスが有効化されていればwsbファイルはサンドボックスに紐づけられているはず。)

備考

  • ホストのImageファイルを利用して実行しているため、Windows Sandbox内のWindowsのバージョンはホストと同じものとなる。
  • configファイルであるwsbファイルで、相対パスが利用できないため、wsbを各ユーザー向けに作成する必要がある。
  • Windowsにプリインストールされているアプリ以外は起動の度にインストールしなおさないといけない。(実質Officeが利用できない。)

まとめ

現在の機能では、OfficeやAdobeアンチウイルスソフト(Windows Defenderは別)がインストールされていない状態のゲストマシンしか作成できないため、利用用途は狭い。 (毎回インストールするのはさすがに時間の無駄かと。) 主な利用用途は不審なパスワード付きZipファイルを解凍する程度か。

Windows 10 21H1のアップデートはマイナーアップデートになると予想されているため、Windows Sandboxの大幅な機能改善は望めない。そのため、便利に使えるようになるまではまだかかりそう。

参考資料

Excelが16桁以上の計算を間違える話。

実験環境

Microsoft Office Professional Plus 2016 (Build 13328.20356)でテストを行っています。

前提

Excelでは16桁以上の数値を扱えず、上から16桁以上の入力は0になってしまうという問題(というか仕様)はよく知られていると思います。

下の画像のように16桁を入力した状態でEnterを押して確定すると、

f:id:hrontan:20201125172549p:plain

この画像のように1桁目が0になってしまいます。(なお、Excelでは桁数が多いと自動で指数表記になってしまうので、セルの書式設定から"数値"を選択しています。)

f:id:hrontan:20201125172936p:plain

下の画像のように17桁を入力した状態でEnterを押して確定すると、

f:id:hrontan:20201125173324p:plain

この画像のように1桁目と2桁目が0になります。

f:id:hrontan:20201125173425p:plain

この仕様については、ちゃんとMicrosoftのドキュメントにも記載があります。

(なので、1000,0000,0000,0000と入れても、1000,0000,0000,0001と入れても、... 1000,0000,0000,0009と入れても全部1000,0000,0000,0000になります。)

問題

さて、Excelは本当に上から15桁までしか記録していないのでしょうか???

結論から言うと、表示はされないけど、(条件によっては)記録はされています。

詳細

まず、16桁の数値に対して計算をしてみて、Excelがどのような挙動をするのか確認してみます。

その1(足し算)

1000,0000,0000,0000に対して足し算をしてみます。

f:id:hrontan:20201125175459p:plain

16桁目は0になるため、

1000,0000,0000,0000 + 1 = 1000,0000,0000,0000

となります。

なので、 1000,0000,0000,0000と1000,0000,0000,0000 + 1 を比較すると"TRUE"(等しい)となります。

では足す数を増やしていきましょう。

f:id:hrontan:20201125181013p:plain

"+ 1" ~ "+ 5"までは 1000,0000,0000,0000ですが、 "+ 6" ~ "+15"は1000,0000,0000,0010となっています。

そして、 1000,0000,0000,0000 + 5 = 1000,0000,0000,0000

と、Excel上の見た目は1000,0000,0000,0000であるにも関わらず、 1000,0000,0000,0000 と 1000,0000,0000,0000 + 5 を比較すると、"FALSE"(等しくない)となります。←ここが記事のタイトル部分

ここから、内部データと表示に差があることが分かります。 (内部は浮動小数で扱っていて、一定の閾値以下なら同一値として扱ったりしているのかなと推測。)

ここから先、便宜的に、16桁以上の数値を記録している謎なものを”内部データ”Excelの画面に表示されている見た目から読み取れるデータを"表示データ"と記します。

なお17桁で同じ表を作ったものが下記の画像 f:id:hrontan:20201125182847p:plain

18桁で同じ表を作ったものが下記の画像です。 f:id:hrontan:20201125183303p:plain

ここから、必ずしも、上から15桁目で四捨五入ならぬ五捨六入を行っているわけでもなさそうです。

その2(条件付き書式)

Excelの機能の条件付き書式のカラースケールを0,10,20の入ったセルに対して掛けると、次の画像のように、3色に塗り分けられます。

f:id:hrontan:20201125181822p:plain

しかし、16桁の計算のA+Bのセルに掛けると、次の画像のように、グラデーションで塗り分けられます。

f:id:hrontan:20201125182101p:plain

ということで、条件付き書式では、内部データを使って動作しているんだな。ということが分かります。

ということで、ここから先はカラースケールを用いて数値をざっくり確認していきます。

その3(テキスト→文字列変換)

ExcelではValue関数を利用すると、文字列から数値へ変換できます。 では16桁の数値の文字列を変換するとどうなるでしょうか?

f:id:hrontan:20201125184801p:plain

きれいに2色に塗り分けられました。

15桁目までが保存され、それ以外は0で埋められるという、セルにキーボードで打ち込んだ時と同じ挙動をしていることが分かります。

その4(文字列型数値の自動変換)

Excelの機能として、文字列として入力された数値の計算を行えるという機能があります。

それを使うと次のようなことができます。(セルの左上に緑の三角が付いているのが、セルの中身が文字列であることを意味します。)

f:id:hrontan:20201125185155p:plain

文字列の'100に対して数値の2を足すことで102という解を求めることができます。

ちなみに、文字列同士を足したりもできます。

f:id:hrontan:20201125185322p:plain

便宜的に、この機能を"自動変換"と呼ぶこととします。

(ちなみにこの自動変換機能、四則演算やSQRT関数では動くけど、SUM関数やAVARAGE関数では機能しないという闇が深い機能なのですが、それはまた別の機会に...)

文字列数値に対して+0をすることで自動変換してみます。

f:id:hrontan:20201125190908p:plain

きれいに2色に塗り分けられました。テキスト→文字列変換と同じ挙動をしています。

その5(文字列変換)

その3とは逆に、数値から文字列に変換してみます。 ExcelではTEXT関数を利用すると、数値から文字列へ変換できます。

f:id:hrontan:20201125201900p:plain

TEXT TEXT関数で変換後の結果は表示データと同一になりました。

その6(コピペ)

下記の練成した表示データと内部データに差がある数値を他のブックにコピペしてみます。

f:id:hrontan:20201125191350p:plain
元のデータ

余計なデータが残らないように"値の貼り付け"から"値"を選択して貼り付けます。

f:id:hrontan:20201125195302p:plain

見た目を整え、条件付き書式を付けると

f:id:hrontan:20201125195501p:plain
コピー後のデータ

(残念ながら?)表示データと異なる内部データもコピーされてしまっていることが分かります。

その7(データ構造)

実際に、Excelブックの中でデータがどのように記録されているのか、内部を覗いてみます。

Excelのファイルの中身はOffice Open XMLで定義されています。

今回はSheet1にデータを書いたので、 ファイル内のxl\worksheets\sheet1.xmlの中身を確認します。

f:id:hrontan:20201125201133p:plain

2行目のデータを確認すると、 ”C2”に、f=A2+B2だけではなく、v=1000,0000,0000,0001との記述があります。 これが内部データの実体でした。

結論

  1. Excelは表示されているデータの他に内部のデータを持っている。(正確には表示データが内部データと等しいとは限らない)
  2. 入力時やテキストからの変換時は仕様に合わせた上位15桁以上は0で埋めるという処理が行われているが、内部データについてはその限りではない。
  3. 16桁以上の値の比較は謎の処理が走っていて内部データそのままでも表示データでもない比較が行われている。 比較を行う際はTEXT関数で文字列に変更してから比較を行う。
  4. 16桁以上の値の数値をExcelブック/シート間でコピペすると、内部データもコピーされてしまうので注意。

解決策

残念ながらExcel単体でできる解決策らしい解決策はないので、16桁以上の数値が出てくる場合はExcelで計算しないように気を付けましょう。

おまけ

Excelの16桁問題は、「クレジットカードの番号を文字列ではなく、数値として記録してしまい、最後の一文字が消えてしまった」みたいなシチュエーションで良く話の俎上に載ります。

上記の話を踏まえると、実はExcelファイルの中身にはデータは残っているので、サルベージできる可能性が僅かながらあります。

ただ、Excelのみ使っている限りは入力の段階でデータが消えてしまっている可能性が高いので、他のソフトウェアやマクロを利用した様な場合に限りると考えられます。

(これぐらいしかこの記事が役に立つシチュエーションを思いつかなかった…)

Visual Studio Code 1.43でRemote-SSHが使えなくなる問題とその解決策

問題

Visual Studio Code (VSCode) を1.43にアップデートすると、Remote-SSHが利用できなくなる。

原因

VSCodeを1.43にアップデートすると、拡張機能にRemote-SSHが0.50.0もしくはそれ以降のバージョンにアップデートされる。 Proxy周りや、パスワードなし鍵を利用している場合、リモートローカルサーバー等に問題がある模様。(あまりよく調べてない)

解決策

Remote-SSH拡張機能を0.49ダウングレードする。 拡張機能の設定から、"Remote-SSH"を選択し、"Install Another Version..." から0.49.0を選択。

Wsus Package Publisherを使ってWindows Update経由で他のソフトウェアをアップデートする

当記事の目的

WSUS環境ではWindows Update経由で配布される更新プログラムの管理・制御が可能です。 この機能を使って、他のソフトウェア(例えばAdobe Acrobat ReaderとかVisutal Studio Codeなど)のプログラムのアップデートを管理できたら便利だな、でもWSUSのAPIを自前のソフトウェアでたたくのはさすがに面倒だな。 という社内SE的な人向けの、Wsus Package Publisherというオープンソースソフトウェアを利用して、これを実現する方法の説明を行っていきたいと思います。(要は備忘録です)

前提条件

WSUS環境が存在する。

Wsus Package Publisherについて

WSUSのAPIを利用するソフトウェアは複数あったようですが、最近はWindowsがマイナーな存在になったのか、現在まともにメンテされているのはWsus Package Publisherのみの様です。 Wsus Package Publisherは下記のリポジトリで開発が行われています。 github.com

ちなみに、同名のCodeplexで開発されていたバージョンはGithubのものに統合されたようです。 archive.codeplex.com

インストールおよび利用方法について

自己署名証明書の準備

まず、アップデートパッチの安全性の保証に用いられる、自己署名証明書を作成する必要があります。 最近のWindowsだとPowershellのNew-SelfSignedCertigicateで自己署名証明書を作成することができます。

とりあえずコード署名の自己署名証明書を作成します。 最近のWindowsの機能更新の有効期限を参考に、(とりあえず)1年半を有効期限としておきます。 下の例では、"WSUSCert"という名前で作成していますが、好きな名前を付けてください。

New-SelfSignedCertificate -Type CodeSigningCert -Subject "WSUSCert" `
-KeyAlgorithm RSA -KeyLength 2048 -KeyExportPolicy Exportable `
-NotAfter (Get-Date).AddYears(1).AddMonths(6)

この証明書はコンピューター証明書の管理のPersonal -> Certificatesに登録されています。 作成した証明書を開き、詳細 ->ファイルへコピーからエクスポートしてください。

自己署名証明書の配布

先ほどの証明書をローカルコンピューターの"信頼されたルート証明機関"および”信頼された発行元”にインストールします。 また、レジストリの次のパスにDWORD値のキーを作成し、1を設定します。 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AcceptTrustedPublisherCerts

AD環境でない場合は個別にインストールするよう設定をし、マシンを再起動してください。

WSUS Package Publisherのインストール

Githubに公開されているWSUS Package Publisherのリリースの中から最新のバージョンを選択し、ソフトウェアをダウンロードする。

Releases · DCourtel/Wsus_Package_Publisher · GitHub

解凍したフォルダの"Wsus Package Publisher.exe"を起動する。

f:id:hrontan:20200309013800p:plain

"Tools"の"Certificate..."から証明書の設定を行う。

f:id:hrontan:20200309013828p:plain

Use an existing certificateのPasswordに、先ほど自己署名証明書をエクスポートした際に設定したパスワードを入力し、 "Load a certificate..."から自己署名証明書を選択する。

f:id:hrontan:20200309013845p:plain

そして、一旦WSUSサーバーを再起動する。

アップデートパッケージの作成

"Updates"の"Create an Update..."からパッケージ作成画面を開きます。

f:id:hrontan:20200309013919p:plain

Update Fileからアップデート用のインストーラーを選択し、Nextを選択し、次の画面に進みます。

f:id:hrontan:20200309014004p:plain

Vandor Name、Product Name、Title、Descriptionを入力します。

f:id:hrontan:20200309014035p:plain

なお、ここで作成されたパッケージはサイレント実行されなければならないため、必要であれば、Command Lineにオプションを設定します。

Nextを選択し、次の画面に進みます。

f:id:hrontan:20200309014105p:plain

この画面ではアップデートが既にインストールされているかどうかを判断する条件を入力します。

大半のソフトウェアでは、下記のレジストリの中身に記載されているDisplayVersionの値を参照することで事足りると思われます。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

その場合は、Reg_Sz Registry Keyを選択し、Add Rule...からルールの設定画面を開きます。

f:id:hrontan:20200309014134p:plain

そしてレジストリのパス、キー名、比較方法、値を入力します。

Nextを選択し、次の画面に進みます。

f:id:hrontan:20200309014207p:plain

この画面ではアップデートをインストールしてよいかどうかを判断する条件を入力します。

こちらでは下記に値があるかどうかを条件とします。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

その場合は、Registry Key Existsを選択し、Add Rule...からルールの設定画面を開きます。

f:id:hrontan:20200309014245p:plain

そしてレジストリのパスを入力します。

Nextを選択し、次の画面に進みます。

f:id:hrontan:20200309014258p:plain

この画面では何も入力せずに、Publishを選択し、次の画面に進みます。

Nextを選択し、次の画面に進みます。

パッケージの承認

Updatesから先ほど作成したパッケージを選択し、

f:id:hrontan:20200309014322p:plain

右クリックから"Approve..."を選択し

f:id:hrontan:20200309014337p:plain

対象のコンピューターグループに対して承認を行います。

f:id:hrontan:20200309014458p:plain

以上で作業は終了です。お疲れ様でした。

追記

下記のソフトウェアのパッケージの設定を記載しておきます。

7-Zip

  • 対象ファイル: {対象のインストーラー}
    • オプション: /S
  • アップデート済み判定条件: Reg_Sz Registry Key
    • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip
    • DisplayVersion
    • Equal To
    • {アップデート後のバージョン}
  • インストール判定条件: Registry Key Exists

Visual Studio Code

  • 対象ファイル: {対象のインストーラー}
    • オプション: /VERYSILENT /MERGETASKS=!runcode
  • アップデート済み判定条件

  • インストール判定条件

※システム―インストール時のみ

Google Chrome

  • アップデート済み判定条件
  • インストール判定条件

Mozilla Firefox

  • アップデート済み判定条件
  • インストール判定条件

Adobe Acrobat Reader

  • 対象ファイル: AcroRdrDCUpd1801120038.msp
    • オプション: /quiet /norestart
  • アップデート済み判定条件: File Version
    • C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe *1
    • Equal To
    • {アップデート後のバージョン}
  • インストール判定条件: File Version
    • C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe *2
    • Less Than
    • {アップデート後のバージョン}

Microsoft Office 2019

  • アップデート済み判定条件
  • インストール判定条件: Registry Key Exists

*1:インストールしているパス

*2:インストールしているパス

Outlook.comのカレンダーとGoogle Calendarを同期する方法

Googleのサービス達がどんどんとシェアを伸ばし、Outlook使いの肩身が狭い今日この頃。

友人たちと

Googleカレンダーでイベント作ってシェアするから参加登録よろ」

「。。。」

とか

バイト先で

「スケジュールをGoogleカレンダーで管理するので、個人のGoogleカレンダーをシェアすること」

「。。。」(Outlook.comメインやし、そもそもなんで個人の予定を全部公開せなあかんの。。。)

とか。

そんな訳で、Outlook.comで追加、編集、削除した予定を Google Calenderに反映する方法を説明したいと思います。 (ちなみに、Google CalenderからOutlook.comに反映したい方向けの説明はしませんが、やることはほぼ同じなので、説明を読んでいただければできるようになると思います。)

準備

今回、同期を行うには、Microsoftサービスである、Power Automate(旧称:Flow)というオートメーションツールを使っていきます。(導入すると「最近流行りのRPAを導入したぜドヤァ」ができます笑)

オートメーションツールツールとは複数のサービスを連携させて自動作業を行わせることができるツールです。例えば、”Gmailに特定のアドレスからメールが来たらTwitterに自動投稿”、や"Alexaに掃除してといったらルンバを起動して、空気清浄機を最大出力にする"みたいなことをプログラムすることができます。

プログラムと聞くと難しそうという気持ちになるかもしれませんが、オートメーションツールでは簡単なマウス操作と設定入力でこれらを使えるようになっています。(なっていることになっています。)

(IFTTTとかZapierとかをご存知の方もいると思いますが、そういった方はそれらの簡易版&Microsoft版だと思っていただければ。)

Microsoft Power Automateは本来有料サービスですが、一部機能を無料枠で利用可能です。 (ただし、新プランへの移行措置のようなので、最短で2020年10月には使えなくなるかもしれません。Office 365のライセンスを契約している人は、それにPower Automateのライセンスが付帯しているようなので、問題ありません。)

そして、今回のカレンダーの同期程度であれば、超ヘビーユーザー※1でない限り事足るので無料枠(もしくはOffice 365付帯のライセンス)を使っていきたいと思います。

※1: 1日のAPIの呼び出し上限が2000件なので、毎日2000件以上カレンダーを編集する方は有料プランを利用してください。

設定

まず、Power Automateのページを開きます。

Microsoft Power Automate | Microsoft Power Platform

つづいて、右カラムから”作成”を選択します。 f:id:hrontan:20200210150633p:plain "Start from blank"の項目に表示されている一番右の"Automated flow"を選択してください。 f:id:hrontan:20200210150801p:plain まず、Flow nameに適当な名前を入力します。 次に、Choose your flow7s triggerの検索窓に"Outlook.com"と入力し、検索結果から、 "When an event is added, updated or deleted"を選択します。 f:id:hrontan:20200210150941p:plain

そして、ここからプログラムに入ります。 まず、最初から配置してあるOutlook.comのトリガー設定で同期対象のカレンダーを選択します。 (通常はデフォルトの"Calender"でよいはずです。)

そして下に条件分岐のアクションを追加し、画像のように設定を行います。 f:id:hrontan:20200210152543p:plain 設定:

  • "Action Type" "is equal to" "added"

次に、Yes側にGoogle Calenderの編集のアクションを追加し、次のように設定します。 f:id:hrontan:20200210152853p:plain 塗りつぶしてある部分は、同期先のカレンダーを選択してください。 設定:

  • Start time: Start time
  • End time: End time
  • Title: Subject (画像ではBusyとなっていますが、これは件名は同期したくなかったのでこのように入力しています。ここに文字列を入れた場合は、そのままこの文字列がGoogle Calender側のイベントの件名になります。)
  • Description: Id

そして、No側にはGoogle Calenderでの検索のアクションと、検索結果のリストを受け取って処理するための再帰処理のアクションを追加し、次のように設定します。 f:id:hrontan:20200210153042p:plain 塗りつぶしてある部分は、先ほどと同様に、同期先のカレンダーを選択してください。 設定:

  • Min time: addDays(utcNow(), -50)
  • Max time: addDays(utcNow(), 300)
  • Search query: Id

※ちなみに、ここでは今から50日前から300日後までのスケジュールを検索しています。なのでそれ以上日付が離れている場合は同期されません。日数を変更したい場合は数字を変更してください。(何日前、何日後まで正しく動くのかは知りません。)

再帰処理の内部に、さらに条件分岐を追加します。 f:id:hrontan:20200210153225p:plain 設定:

  • Select an output from previous steps: Event List Items

設定:

  • "ActionType" "is equal to" "deleted"

条件分岐の中身はそれぞれ、画像のように設定してください。 f:id:hrontan:20200210153344p:plain ここもまた、塗りつぶしてある部分は、同期先のカレンダーを選択してください。 設定:

  • Event ID: Event List Event Id

設定:

  • Event ID: Event List Event Id
  • Title: Subject
  • Start time: Start time
  • End time: End time
  • Description: Id

以上で設定は終わりです。

この設定を行っておくと、Outlook.comのカレンダー側で編集を行った際に、自動でGoogle Calender側に同期されるようになります。 ちなみに、残念ながら、無料プランや付帯プランだと、同期に30分ほどかかるようです。

旅かえるのアルバムをお手軽にバックアップする方法(ある程度パソコンに詳しい人向け・ルート化不要)

旅かえる癒されますよね。
かえる達の写真を見るとほっこりします。

アプリを起動しなくてもほっこりできるようにPCにも保存しているのですが、これが結構面倒。
旅好きなかえるから、結構な枚数の写真が送られてくるので、スマホの機能で共有するのも楽ではありません。
そこでお手軽にバックアップする方法を考えました。
なお、本方法はAndroid版 ver.1.2.1を想定しています。


1. Androidに適当なFile Managerを入れる。 (スマホ側の操作)
最近のAndroid機には、元からFileManagerが入っていることも多いです。
"Android"フォルダが見えるのであればそれでも可です。
私はX-ploreというアプリを使いました。

2. /Android/data/jp.co.hit_point.tabikaeruフォルダをPCにコピーする。(スマホ側の操作)
私はX-ploreの機能を使ってzipに圧縮した後、Dropboxにアップロードして共有しました。

3. jp.co.hit_point.tabikaeruフォルダのfiles/Pictureに入っているalbum_*.savファイルをすべて取り出します。
今のバージョンだとalbum_(日時).savみたいな名前になっています。

4. 取り出したすべてのファイルの先頭4バイトを削除し、拡張子を.savから.pngに変更します
私の場合、WSLを使っていたのでBash上で

ls *.sav | xargs -I% dd if=% of=%.png bs=1 skip=4

とかやりました。


これで今日からスマホがなくともかえるを愛でることができますね!

PowerShell で一時的にスクリプトの実行を許可する方法

PowershellのExecution-Policyを恒久的に変更してスクリプトの実行を許可してしまうと、

  • 実行許可の取り消し忘れによるセキュリティの問題
  • そもそも変更にアドミン権限が必要で面倒

などの問題があります。

それを解決する方法として、スコープを使うことで実行中のターミナルのみ、Execution-Policyを変更できます。

Set-ExecutionPolicy RemoteSigned -Scope Process

以上です。

ちなみに個人的には、RemoteSignedぐらいが、開発中のマシンで使うセキュリティレベルとしてはちょうどいいかなと思っています。
必要に応じてもっと緩く設定してください。

Windows Subsystem for Linuxで、Windows側のSSHキーと設定を使う方法

目的

WindowsでWin32-OpenSSHがまともに使えるようになってきて、Windows側とWSLの両方でSSHを使うよって人もいるかもしれません。
とりあえず、ここに一人います。

SSH鍵のセットアップって、結構面倒(主に、リモート先で鍵を追加して回るのが面倒)なので共有できたら楽ですよね。
別マシンで秘密鍵を流用するのはセキュリティ的によくないことですが、WSLなら物理一台なのでいいじゃん。と先に言い訳しておきます。

方法

まず、WSLのディレクトリマウントのオプションを設定します。

vim /etc/wsl.conf

下記を追記してください。

[automount]
enabled = true
options = "metadata"


続いて下記の操作を行います。

sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata
ln -s /mnt/c/Users/[Username]/.ssh/ ~/.ssh
cd ~/.ssh
chown [Username] *
chmod 600 *

具体的に何をしているのかというと、

  1. 一旦Windows側のファイルシステムをアンマウントして、
  2. wsl.confで設定したのと同様の設定でマウントしなおし、
  3. パーミッションを正しく設定しなおしてる

って感じです。

これで、再起動を行っても問題なく、WSLからWindows側の設定でSSHが使い続けられるようになります。

追記 [2020/12/23]

sshで多段プロキシを利用する際に、ProxyCommandを記載すると思うのですが、

ProxyCommand ssh [踏み台サーバー] -W %h:%p

ではなく

ProxyCommand ssh.exe [踏み台サーバー] -W %h:%p

と記載しないと

CreateProcessW failed error:2
posix_spawn: No such file or directory

Windows側でプロセスの立ち上げができず、エラーで動きません。
ちなみにWindows側のフルパスで記載をしていると、もちろんWSL側ではパスの解決ができないのでエラーで動きません。
要注意です。

High SierraでJohn The Ripperをコンパイルする方法。

OS X (High Sierra) 上でJtRを使おうとして色々と罠があったのでメモ。

GCCとOpenSSLのインストール

まず、GCCとOpenSSLをインストールします。その後、OpenSSLにパスを通します。

$ brew update && brew upgrade
$ brew install gcc openssl


続いてOpenSSLにパスを通します。

$ brew list openssl
/usr/local/Cellar/openssl/1.0.2n/.bottle/etc/ (8 files)
/usr/local/Cellar/openssl/1.0.2n/bin/c_rehash
/usr/local/Cellar/openssl/1.0.2n/bin/openssl
/usr/local/Cellar/openssl/1.0.2n/include/openssl/ (75 files)
/usr/local/Cellar/openssl/1.0.2n/lib/libcrypto.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.2n/lib/libssl.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.2n/lib/engines/ (12 files)
/usr/local/Cellar/openssl/1.0.2n/lib/pkgconfig/ (3 files)
/usr/local/Cellar/openssl/1.0.2n/lib/ (4 other files)
/usr/local/Cellar/openssl/1.0.2n/share/man/ (1680 files)

$ export PATH=/usr/local/Cellar/openssl/1.0.2k/bin:$PATH

$ which openssl
/usr/local/Cellar/openssl/1.0.2k/bin/openssl

JohnTheRipperのコンパイル

公式のリポジトリからソースコードを取得し、コンパイルします。

$ git clone --depth 1 git@github.com:magnumripper/JohnTheRipper.git
$ cd JohnTheRipper/src
$ ./configure CPPFLAGS="-I/usr/local/Cellar/openssl/1.0.2k/include" CFLAGS="-I/usr/local/Cellar/openssl/1.0.2k/include" LDFLAGS="-L/usr/local/Cellar/openssl/1.0.2k/lib" --disable-pkg-config CC="gcc-7"  
$ make -s clean && make -sj4


最後に操作確認をします。

$ cd ../run
$ ./john --test

IntelliJ Ultimate Editionを無料で使う方法。(学生向け)

IntelliJ使ってますか? 私は使っていませんでした。(笑)

所用でJavaを使い始めることとなり、IDEとしてIntelliJを選択することに。。。 最初はCommunity Editionをインストールしようとしたのですが、

「もしかしてEnterprise Editionとかあったりしちゃう???学生だと無料で使えちゃったりしちゃう???」

と悪魔のささやきが。

調べて見ると、なんとあるではないですか!Ultimate Edition!!!

そして学生無料!!!

使うしか無いですね〜

申請方法

www.jetbrains.com

ここで、名前と大学のメールアドレスを使って申請。 すぐに認証メールが届くの、URLをクリックすれば使えるようになります。

注意事項

  • 営利目的には使えない
  • 有効期限は1年間。(必要なら、一年ごとに再申請)

ということでみなさんも是非快適なIntelliJ生活を