hack のためのネタ帳, etc,,,

SID (Security Identifier。セキュリティ識別子)
Windowsのアクセス権管理に用いられるID

クリーンインストールするとSIDが変わってしまうため保存してあるファイルへのアクセス権が切れてしまう。
クリーンインストールを期にHDDを入れ替え、
古いOSの入ったHDDをスナップショット的に保存しておくような場合、
アクセス権を書き換えないと古いHDDの個人用のファイルにアクセスができなくなってしまう。
古いHDDに差し戻して古いシステムを動作させる場合に、アクセス権が書き換えられた状態になってしまうため
動体保存として考えるなら、クリーンインストール毎にアクセス権情報を追記していかないといけないためかなり厄介である。
SIDレベルでWindowsのアカウントをimport/exportできればよいのだがどうもそういう機能はないらしい。
ADやDomain使っていると抜け道があらしいが、そもそも個人用途向けではないし、個人用にはかなり敷居も高い。
マジどうにかして欲しい。
# とは言え、SIDにはマシンの固有IDも含まれてるみたいなので
# ADやDomaiじゃない環境でローカルマシン以外のID入ったSID混ざると
# それはそれで気持ち悪いのかも?
以下のキーに SID のバイナリが格納されているようだ。
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-*\Sid

構造についての説明が見つからなかったが、
パッと見た感じだと
SID String "S-R-I-S..." に対して
SID のバイナリのバイト並びはリトルエンディアンで
R, N, ?, ?, ?, ?, ?, I, S[0] * 4, ..., S[N-1] *4
のようになってるっぽい。

? の部分はサンプルが少な過ぎて特定出来なかったが、
とりあえず、

sid_test.rb

#!/usr/bin/env ruby

ARGV.each do |fn|
  c = (s = IO.read(fn,32)).unpack("C8")
  sid = (["S", c[0], c[7]] + s[8..8+4*c[1]].unpack("V*")).join("-")
  print "#{sid}\n"
end
のようにして
以下のように実行すると HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-* と同じ値が得られた。
$ ./sid_test.rb /proc/registry/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows\ NT/CurrentVersion/ProfileList/S-1-5-*/Sid
S-1-5-18
S-1-5-21-xxxxxxxxxx-xxxxxxxxx-xxxxxxxxxx-1001
S-1-5-21-xxxxxxxxxx-xxxxxxxxx-xxxxxxxxxx-1003
WMIC コマンドの group 及び useraccount サブコマンド、PowerShell の Get-LocalGroup, Get-LocalUser コマンドを使うと得られる模様。
wmic group       get name,sid
wmic useraccount get name,sid
powershell -c "Get-LocalGroup | % {\"{0,-32} : {1}\" -f $_.name,$_.sid.value}"
powershell -c "Get-LocalUser  | % {\"{0,-32} : {1}\" -f $_.name,$_.sid.value}"

Cygwin の permission と言うか、ACL と言うか、「%USERDOMAIN%\なし」の SID、wautils で探すと
$ ./LookupAccountSid $USERDOMAIN S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-513
 |& iconv -f CP932
SystemName           : $USERDOMAIN
SID                  : S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-513
ReferencedDomainName : $USERDOMAIN
AccountName          : なし
みたいに出て来るけど、上記の wmic や powershell のコマンドだと見つからない。
これはどうすれば良いのだろう?

参考: 関連:
タグ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます