#事の始まり
2018/04の大型アップデートを当てたあたりから、イベントビューアにへんなエラーログがいっぱい出て、アプリの起動や動作が重くなる現象が発生するようになった。以下が変なログの例だ。
ソース(S) : SecurityCenter
イベントID(E) : 16
レベル(L) : エラー
ユーザー(U) : N/A
オペコード(O) :
タグの日付(D) : YYYY/MM/DD HH:MM:SS
タスクカテゴリ(Y) : なし
キーワード(K) : クラシック
コンピューター(R) : (自分のPC名)
EventData : SECURITY_PRODUCT_STATE_ON 02000000
全般 :
の状態を SECURITY_PRODUCT_STATE_ON に更新中にエラーが発生しました。
ソース(S) : DistributedCOM
イベントID(E) : 10010
レベル(L) : エラー
ユーザー(U) : (自分のPC名)\(ユーザ名)
オペコード(O) : 情報
タグの日付(D) : YYYY/MM/DD HH:MM:SS
タスクカテゴリ(Y) : なし
キーワード(K) : クラシック
コンピューター(R) : (自分のPC名)
EventData : param1 {AB8902B4-09CA-4BB6-B78D-A8F59079A8D5}
全般 :
サーバー {AB8902B4-09CA-4BB6-B78D-A8F59079A8D5} は、必要なタイムアウト期間内に DCOM に登録しませんでした。
とよくわからない、正体不明エラーがものすごい出るようになりました、何もしないのに、5秒間隔くらいで出まくる
確かWindowsのSecurityCenterは他社のセキュリティツールを使っているとよく問題を起こすうえ、回復方法が復元ポイントからの復帰しかない。
問い合わせてみた
念のためMicroSoftのサポートに連絡をしてみたが案の定
・「新規アカウントを作成」して同じ問題が起きるかどうか確認する。
・システム ファイルの修復などを行う以下の手順を実行する。
1. 左下のスタート メニューを右クリックし、[コマンド プロンプト (管理者) ] を選択します。
2. [このアプリが PC に変更を加えることを許可しますか?] と表示された場合は [はい (Y)] を選択します。
3. 黒いコマンド プロンプト画面に以下を入力して Enter キーを押します。
dism /online /cleanup-image /restorehealth
4. 同じプロンプト画面に以下を入力して Enter キーを押します。
sfc /scannow
・復元ポイントから問題の発生する前の日付に復元してみる
というお決まり回答をもらった、なお、「新規アカウントを作成」と「ファイルの修復」は試してみてダメだった。
「復元ポイント」は経過日数がありすぎて、戻すといろいろ巻き戻るのであきらめた。
悪あがきしてみよう
これは、最終手段としてクリーンインストールしかないかな。とあきらめモードでしたが、1つ思いついたことがあったので試してみることに。
Windows Security Centerはあくまでセキュリティ関連の告知とセキュリティーツールの集約をしているだけのはずなので、サードパーティ製のツールで一時しのぎできないかと。
というのも、バックアップを取ろうにも謎のエラーイベントのおかげで、ツール類の動作が遅くて話にならないため、一旦SecurityCenterを止めて、バックアップデータを確保したい。
一旦問題のサービスを止めたい
確か、Windows7の時は管理者起動した、コマンドプロンプトでsc.exeでサービスが停止できたはず。
SecurityCenterの実体はwscsvcなので、以下のように停止を打ち込んでみた
sc.exe stop "wscsvc"
[SC] OpenService FAILED 5:
アクセスが拒否されました。
あれ?、じゃあ起動無効化にして再起動すればいいのでは、と思って無効化コマンド
sc.exe config "wscsvc" start=disabled
[SC] OpenService FAILED 5:
アクセスが拒否されました。
む、管理者なのにアクセスできない…じゃあ、サービスのACLを確認してみると
sc.exe sdshow "wscsvc"
D:(A;;CCLCSWRPLORC;;;BU)
(A;;CCLCSWRPLOCRRC;;;SY)
(A;;CCLCSWRPLOCRRC;;;BA)
(A;;CCLCSWRPLORC;;;IU)
(A;;CCLCSWRPLORC;;;SU)
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464)
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-80-259296475-4084429506-1152984619-38739575-565535606)
S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
なんだと…、管理者でも扱えない権限だと…
やむを得ず、一旦Taskkillでつぶすか
まず該当プロセスを探して
tasklist /SVC /FI "SERVICES eq wscsvc"
イメージ名 PID サービス
========================= ======== ============================================
svchost.exe 12164 wscsvc
見つけた、PIDは12164だった。で、これを
taskkill /F /PID 12164
成功: PID 12164 のプロセスは強制終了されました。
お、止められた。確認してみる
tasklist /SVC /FI "SERVICES eq wscsvc"
情報: 指定された条件に一致するタスクは実行されていません。
よし、止まってる、今のうちにバックアップだ…
と思ってたら、10分ほどで…急にバックアップが激重になったので、再度プロセスを確認してみると
tasklist /SVC /FI "SERVICES eq wscsvc"
イメージ名 PID サービス
========================= ======== ============================================
svchost.exe 7696 wscsvc
あれ、復活してるやん。だめか。無効化して止めるしかないか。
Windows10のサービスにはACLが付与されたんだよ!!
たしか、WindowsのサービスのACL変更は、sc.exe sdset "サービス名" "SDDL表記"だったと記憶してる
sc.exe sdshow "wscsvc"で確認した限り、DACLの指定とSACLの指定が指定されているので、これにのっとって権限を追加する
- SDDL表記について
SDDL表記 | 用途 |
---|---|
O:ユーザーSID | オブジェクト所有者のSIDの指定 |
G:グループSID | オブジェクトのプライマリグループのSIDの指定 |
D:DACLフラグ(ACE文字列1)(ACE文字列2)……(ACE文字列n) | DACLの指定 |
S:SACLフラグ(ACE文字列1)(ACE文字列2)……(ACE文字列n) | SACLの指定 |
- DACLの指定 - DACLフラグ(SACLフラグも同じものになる)
文字列 | フラグ名 | 意味 |
---|---|---|
"P" | SE_DACL_PROTECTED | DACLが継承されたACEによって変更されないように保護する |
"AR" | SE_DACL_AUTO_INHERIT_REQ | DACLを子オブジェクトへ継承するように要求する |
"AI" | SE_DACL_AUTO_INHERITED | 継承によって作成されたDACLであることを示す |
- DACLの指定 - ACE文字列
書式:(ACEタイプ;ACEフラグ;権利;オブジェクトGUID;継承オブジェクトGUID;アカウントSID)
- ACEタイプ
文字列 | タイプ名 | 意味 |
---|---|---|
"A" | SDDL_ACCESS_ALLOWED | アクセス許可 |
"D" | SDDL_ACCESS_DENIED | アクセス拒否 |
"OA" | SDDL_OBJECT_ACCESS_ALLOWED | オブジェクトアクセス許可 |
"OD" | SDDL_OBJECT_ACCESS_DENIED | オブジェクトアクセス拒否 |
"AU" | SDDL_AUDIT | 監査 |
"AL" | SDDL_ALARM | 警告 |
"OU" | SDDL_OBJECT_AUDIT | オブジェクト監査 |
"OL" | SDDL_OBJECT_ALARM | オブジェクト警告 |
- 権利
文字列 | 権利名 | 意味 |
---|---|---|
"GA" | SDDL_GENERIC_ALL | 全アクセス権(読み書き実行) |
"GR" | SDDL_GENERIC_READ | 読み出し |
"GW" | SDDL_GENERIC_WRITE | 書き込み |
"GX" | SDDL_GENERIC_EXECUTE | 実行 |
"RC" | SDDL_READ_CONTROL | ACL情報の読み取り |
"SD" | SDDL_STANDARD_DELETE | 削除 |
"WD" | SDDL_WRITE_DAC | DACLの書き込み |
"WO" | SDDL_WRITE_OWNER | 所有者情報の書き込み |
"RP" | SDDL_READ_PROPERTY | オブジェクトのプロパティの読み出し |
"WP" | SDDL_WRITE_PROPERTY | オブジェクトのプロパティの書き込み |
"CC" | SDDL_CREATE_CHILD | 子オブジェクトの作成 |
"DC" | SDDL_DELETE_CHILD | 子オブジェクトの削除 |
"LC" | SDDL_LIST_CHILDREN | 子オブジェクトの一覧 |
"SW" | SDDL_SELF_WRITE | 検証済み書き込みアクセス権によって制御される操作の実行 |
"LO" | SDDL_LIST_OBJECT | オブジェクトの一覧 |
"DT" | SDDL_DELETE_TREE | 全ての子オブジェクトの削除 |
"CR" | SDDL_CONTROL_ACCESS | 拡張アクセス権によって制御される操作の実行 |
"FA" | SDDL_FILE_ALL | 全アクセス権(読み書き実行) |
"FR" | SDDL_FILE_READ | 読み出し |
"FW" | SDDL_FILE_WRITE | 書き込み |
"FX" | SDDL_FILE_EXECUTE | 実行 |
"KA" | SDDL_KEY_ALL | 全アクセス権(読み書き実行) |
"KR" | SDDL_KEY_READ | 読み出し |
"KW" | SDDL_KEY_WRITE | 書き込み |
"KX" | SDDL_KEY_EXECUTE | 実行 |
- オブジェクトGUID
パスワードの変更やリセットなど、特別なタスクの実行を許可するための権利を表すオブジェクトのGUID文字列
- 継承オブジェクトGUID
ACEを継承するオブジェクトのGUIDを表す文字列
- アカウントSID
文字列 | アカウント名 |
---|---|
"AO" | Account operators |
"AN" | Anonymous Logon |
"AU" | Authenticated Users |
"BA" | ビルトイン(Built-in) Administrators |
"BG" | ビルトイン(Built-in) Guests |
"BO" | Backup Operators |
"BU" | ビルトイン(Built-in) Users |
"CA" | Cert Server Admins |
"CG" | Creator Group |
"CO" | Creator Owner |
"DA" | Domain Administrators |
"DC" | Domain Computers |
"DD" | Domain Controllers |
"DG" | Domain Guests |
"DU" | Domain Users |
"EA" | Enterprise Administrators |
"ED" | Enterprise Domain Controllers |
"IU" | Interactive |
"LA" | ローカル(Local) Administrator |
"LG" | ローカル(Local) Guest |
"LS" | ローカル(Local) Service |
"NO" | Network Configuration Operators |
"NS" | Network Service |
"NU" | Network |
"PA" | Group Policy Administrators |
"PO" | Printer Operators |
"PS" | Principal Self |
"PU" | Power Users |
"RC" | Restricted Code |
"RD" | Terminal Server Users (RD=Remote Desktop) |
"RE" | Replicator |
"RS" | RAS Servers |
"RU" | Pre-Windows 2000 Compatible Access |
"SA" | Schema Administrators |
"SO" | Server Operators |
"SU" | Service |
"SY" | ローカル(Local) System |
"WD" | Everyone (WD=world) |
"S-1-……" | 標準的な表記によるSID |
DACLのまとめ
つまり、sc.exe sdshow "wscsvc"で見えた、以下を例にとると
書式:(ACEタイプ;ACEフラグ;権利;オブジェクトGUID;継承オブジェクトGUID;アカウントSID)なので
D:(A;;CCLCSWRPLORC;;;BU)
権利の"CCLCSWRPLORC"は2文字ずつ区切るので
DACLキー指定:
フラグなし
(
アクセス許可;
ACEフラグなし;
CC: SDDL_CREATE_CHILD
LC: SDDL_LIST_CHILDREN
SW: SDDL_SELF_WRITE
RP: SDDL_READ_PROPERTY
LO: SDDL _LIST_OBJECT
RC: READ_CONTROL
;
オブジェクトGUIDなし;
継承オブジェクトGUIDなし;
BU:ビルトイン(Built-in)Users
)
っていう意味になる、ややこしい、上にわからん
実際にアクセス許可を与えてみよう。
※ここで注意してほしいのが、設定は追加じゃなくて上書きなので、必ず前のACLはバックアップしておくこと
バックアップに自信がなかったらレジストリの以下のキーをエクスポートしておくといい
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<該当のサービス名>\Security
最終確認
まず、自分のユーザのSIDを確認する
whoami /user
USER INFORMATION
----------------
ユーザー名 SID
================= ==============================================
localpc0001\owner S-1-5-21-2379077036-1330717485-1244253989-1001
こんな感じに、ユーザ名にホスト名\ユーザ名、SIDに自分のSIDが確認できる
次に対象サービスのACLを確認する
sc.exe sdshow "wscsvc"
実際に書き換えるのは矢印のついてるところとモノを自分のSIDで一行追加する
わかりやすいように、ACEごとに改行してる
D:(A;;CCLCSWRPLORC;;;BU)
(A;;CCLCSWRPLOCRRC;;;SY)
(A;;CCLCSWRPLOCRRC;;;BA)
(A;;CCLCSWRPLORC;;;IU)
(A;;CCLCSWRPLORC;;;SU)
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464) ← 参考にする
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-80-259296475-4084429506-1152984619-38739575-565535606) ← 参考にする
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-2379077036-1330717485-1244253989-1001) ← 追加する
S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
実際に設定する
sc.exe "ホスト名" sdset "サービス名" "SDDL"
なので、分解したのを1行に戻して実行
sc.exe "localpc0001" sdset "wscsvc" "D:(A;;CCLCSWRPLORC;;;BU)(A;;CCLCSWRPLOCRRC;;;SY)(A;;CCLCSWRPLOCRRC;;;BA)(A;;CCLCSWRPLORC;;;IU)(A;;CCLCSWRPLORC;;;SU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-80-259296475-4084429506-1152984619-38739575-565535606)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-2379077036-1330717485-1244253989-1001)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"
終わったら、今度こそ
sc.exe config "wscsvc" start=disabled
[SC] ChangeServiceConfig SUCCESS
よし、止まった、これで再起動してバックアップしたら、クリーンインストールだ!!
長かった、ほんと、WindowsのACLは厄介すぎる。