UACって？管理者権限って？特権昇格って？

# まず前提知識から。
## アカウントとは（ユーザアカウント・システムアカウント）
Windowsには『アカウント』という概念がある。
例えば私は『Taro（太郎）』というアカウントでログインしている。
（※実際は本名なのでボカしています）
これこれ。最初にログインするやつ。PCセットアップ時に作った人も多いはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/36a54f77-8f25-4b00-8259-8692788facc5.png)
そしてこの**人間がログインする系のアカウント**は他にも存在する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/a741c3c6-a112-4177-bef4-b30b67904c97.png)
一番上にあるのが『Taro』という私が使っているアカウント。
その下にあるAdministratorというのが最高権限をもったアカウント。
作った覚えがなくてもデフォルトで作成されている。
「では最初のログインで、パスワードさえ分かればAdministratorというアカウントにもログインできるのか」と言われると、答えはできない。なぜならデフォルトではこれらアカウントは無効になっており、形だけある状態だからだ。下のコマンドプロンプト（黒い画面）では、他のアカウントは"False（無効）"になっているのが分かる。
これらは<font color="red">**ユーザアカウント**</font>と呼ばれる。

これに対し、システムが利用するアカウントも存在する。
これらはGUIでは確認しにくいが、例えばタスクマネジャーでは今、どのユーザが何のソフトを利用しているか確認できる。
例えば今私はChromeでQiitaを更新しているのでChromeの利用しているユーザは当然"Taro（太郎）"になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/a18a8d1d-cd34-4788-b289-0e0d9c0c68ff.png)
「え、当たり前じゃん。逆にお前以外に誰がそのPCを利用しているんだよ笑」とお思いかもしれませんが、実は私以外のアカウントもこのPCを利用しています。
**UMFD-2やSYSTEMなど、先ほどのユーザ一覧にはなかったユーザがいる。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/98154904-7735-44fd-999a-08e6b5c6b495.png)
これらは人間が利用するアカウントではなく、システムが利用しているアカウントとなっています。これらは<font color="red">**システムアカウント**</font>と呼ばれます。

## 権限とは
特定の操作をする際に必要になる資格です。
基本的にユーザアカウントの権限は『**一般ユーザ権限**』と『**管理者権限**』に大別されます。
一般ユーザ権限はイメージ通り、特定の安全な操作のみしか許可されていません。
管理者権限は、特定の操作（例えばポートの解放やプログラムフォルダの操作など）を行うために必要な権限です。

システムアカウントは知識不足で確認中……でもだいたい同じなハズ。



## グループとは
アカウントが所属するものです。そのままですね。
そして最大の特徴は**グループに権限があり、グループに所属することによってそのアカウントの権限が変わってくるという点**です。
つまり、アカウント1つ1つに「君には管理者権限を。君には標準ユーザ権限を。」という風に権限を付与しているというより、「Administrator**s**というグループに所属している君と君には管理者権限を。Usersというグループに所属している君は標準ユーザ権限を。」という概念です。同じような意味ですがより正確に抑えておいた方が理解が深まります。
**グループはたくさんあります。私はAdministrators（管理者達）というグループに所属しています。**
また、<font color="red">**ユーザアカウントは必ず何かしらのグループに所属する必要があります。**</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/e6566700-8cfc-4904-b3e8-a9401adede60.png)
ここで、「権限は2つしかないのに、なぜグループはこんだけあるのか。"管理者権限を持ているグループ（Administrators）"と"持ってない一般グループ（Users）"だけでいいではないか」とお思いかもしれません。
実は、管理者権限といってもその操作によって許可をする・しないを決められるのです。
具体的に説明すると、『Backup Operators』というグループにいれられたアカウントは確かに管理者権限を有していますが、バックアップ系の管理者権限しか付与されません。
ここからは私の推測ですが、例えばファイル復元のための操作などは許可されますが、ポートの解放など、バックアップに関係のない管理者権限は付与されていないというイメージです。
**それぞれのグループがどんな操作を許可されているか見れます。バックアップオペレーターズというグループはファイル操作の許可が多いように見えますが必要最低限しか許可されていません。
Administratorsというのは、ファイル操作やFWの変更、ユーザの作成など関係なくほぼ全ての権限が付与されるグループという訳ですね。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/81a77a9d-d0ba-41ad-9c60-09f924e34ac2.png)
※全てがここで確認できる訳ではない模様。例えばファイアウォールの操作（ポート開放等）については、誰が許可されているかなど何故か見れません。
※最高レベルの権限を持つAdministratorsグループはほとんどの操作に許可の記載がされていますが、一部記載されていない箇所はなぜなのか。利用できないのか。それは何故なのかは分かりません……

こう見ると、ユーザアカウントはグループに必ず所属し、そのグループで可能なことが別れているのに対し、システムアカウントはアカウント名（SYSTEM等）がそのまま記載されているのですね。
システムアカウント版のグループなどはないのかな……調べても出てきませんでした。

## UAC（User Account Control）とは
**ユーザアカウントが管理者権限が必要な操作を行おうとした際にポップアップが表示され、ワンクリックでそのまま実行するのを防ぐ仕組み**です。
そしてこれは"**User Account** Control"ともある通り、ユーザアカウントにしか適用されません。つまりSYSTEMアカウントが管理者権限が必要な操作をバックアップで行う場合などはUACのポップアップなど出ません。

**管理者ユーザがプログラムフォルダ編集しようとした際、「本当に書き換えるのですね？」という同意のUACが出る**

**一般ユーザがプログラムフォルダ編集しようとした際、「てめぇにその権限はねぇよ。管理者ユーザの許しを得てからにしてくれ。管理者さーーーん。こいつの隣にいらっしゃいます？こいつの操作がいいなら貴方のIDとPWを今入れてもらってもいいですかねーーー？」という資格情報のUACが出る**

**システムアカウントがプログラムフォルダ編集しようとした際、管理者権限があれば無言でバックグラウンドで実行され、権限がなければ裏でエラーになります。いずれにせよUACのポップアップなど出ず、利用しているユーザ（人間）は気付きようがありません。**


## 余談：プログラム実行しているアカウントについて（編集途中。理解あいまい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/19113649-2cd7-4208-9210-37f4a2945570.png)
タスクマネージャーを見ると、起動中のプログラムとそれを実行中のアカウントが見れます。
モザイクをかけている上のほうのものが私が実行中のものです。Chromeは、私がショートカットアイコンをクリックして実行したものですから、当然私が実行者になるのも納得です。
下の方にあるDWM-3やLOCAL SERVICEはシステムアカウントです。ユーザが意識せずとも裏で動いてくれているものとなります。

しかし、例えばChromeの下にある"RAVBg64.exe"など「え、私こんなの実行した記憶ないけど」というものまで私名義で実行されています。
どうせログインした際にユーザ名義で実行されるからとかそんな理由でしょうが、そういうユーザが意識しないところで実行するプログラムこそがシステムアカウントの役割なのではと思ってしまう。謎。

隣にあるセッションとは、どのユーザアカウントで実行中なのかを表します。セッション0は誰もユーザアカウントがログインしていない状態で既にシステムアカウントが実行している、PC稼働に必要なものです。
1と2は特別なもの？でセッション3から、今ログイン中のユーザに紐づくセッションIDとなるそうです。
つまり、セッションID：0の実行アカウント名にユーザアカウントが入ることは基本ないはず