Windows下是如何分配管理員許可權的,究竟誰才是真正的管理員?

背景:

題主是個沒有任何計算機知識的小白,最近在學習編程,希望能夠提高自己對Windows的了解,以及操作熟練度,於是開始學習PowerShell。剛一開始時就發現了一個問題,就是在Update-Help的時候系統提示需要Run as administrator,可是登陸的賬戶就是在管理員的分組裡的(這個分組內共有2個賬戶,一個是裝系統時由我創建的,一個是Administrator)。於是我猜測是否是Windows的保護機制,需要管理員許可權的話必須由我確認,並且需要提權的話必須由我親自動手。於是有了如下步驟。

1、 Win+R,輸入:

runas user:frank powershell.exe

CMD要求我輸入賬戶密碼,輸入後成功進入PowerShell,輸入cmdlet:

Update-Help -Force

提示失敗,許可權錯誤,要求Run as administrator。

此時我就有點鬱悶,我不就是administrator嗎?搜索了下,得知還有個系統自建Administrator。

2、Win+R,輸入

runas user:administrator powershell.exe

結果系統任然無情的拒絕了我,在我輸入完密碼之後CMD一閃而過,我試了幾次都是一閃而過,於是我用系統自帶的PrtSc截圖,被告知密碼錯誤。於是我去給系統內建的Administrator賬戶設置了密碼,並且解除鎖定,再次運行

runas user:administrator powershell.exe

在CMD內輸入密碼後,這次成功進入PowerShell了,輸入cmdlet:

Update-Help -Force -Debug

更新也成功了。

可是我被搞糊塗了,明明我也是管理員,為什麼我卻不能做這些操作?還是我第一次操作時的姿勢不對?於是我通過網路搜索了一些資料(可能我的搜索能力較差,搜索到的資料很多,可是回答大多都是含糊其辭。),我了解到Linux是可以通過sudo的,但是前提是通過root用戶的批准。

問題:

1、為什麼大家在管理員分組,而我卻不是「真正的」管理員。

2、Windows是否有辦法實現類似於sudo的功能?

3、有沒有哪些資料是介紹Windows用戶許可權分配的?

4、再補充一個問題,就是關於CMD運行完成後就直接一閃而過,報錯的原因都來不及看,這種情況除了用截屏這種野路子,是否有更好的方法?

5、最後再補充個,我對Administrator已經解除登陸鎖了,那日常在Frank這個管理員賬戶下進行工作會有很大的安全風險嗎?

知乎大神多,這個問題可能很小白,求大家不吐槽。


右鍵選擇run as admin。admin的用戶打開程序默認也是非管理員許可權的


1、為什麼大家在管理員分組,而我卻不是「真正的」管理員。

3、有沒有哪些資料是介紹Windows用戶許可權分配的?

stack overflow和MSDN blog上已經有一個很好的回答了。我就偷下懶, 注意看加黑的部分。

windows - What are the differences between "Run as administrator" and a manifest with requireAdministrator?

With the information given there would be no differences in the permissions between the two processes.

If you request an execution level of "requireAdministrator" via the applications manifest your application will either be launched with the full access token of an administrator or not at all if the user denies consent (see Create and Embed an Application Manifest (UAC) for further information).

The same will happen when a user chooses Run as Administrator.

The only difference is the way that the process is started. When you start an executable from the shell, e.g. by double-clicking in Explorer or by selecting Run as Administrator from the context menu, the shell will call ShellExecute to actually start process execution. The whole process of elevation is hidden inside this function. Kenny Kerr describes this process in more details in Windows Vista for Developers – Part 4 – User Account Control:"

如果你在explorer里雙擊運行exe的話,內部是這樣的:

ShellExecute first calls CreateProcess to attempt to create the new process. CreateProcess does all the work of checking application compatibility settings, application manifests, runtime loaders, etc. If it determines that the application requires elevation but the calling process is not elevated then CreateProcess fails with ERROR_ELEVATION_REQUIRED. ShellExecute then calls the Application Information service to handle the elevation prompt and creation of the elevated process since the calling process obviously doesn』t have the necessary permissions to perform such a task. The Application Information service ultimately calls CreateProcessAsUser with an unrestricted administrator token.

If on the other hand you want to create an elevated process regardless of what application information is available then you can specify the little-known 「runas」 verb with ShellExecute. This has the effect of requesting elevation regardless of what an application』s manifest and compatibility information might prescribe. The runas verb is not actually new to Windows Vista. It was available on Windows XP and Windows 2003 and was often used to create a restricted token directly from the shell. This behavior has however changed. Here is a simple example:

::ShellExecute(0, // owner window
L"runas",
L"C:\Windows\Notepad.exe",
0, // params
0, // directory
SW_SHOWNORMAL);

總結如下:

」So essentially starting an executable using the Run as Administrator option means that ShellExecute bypasses the checks for compatibility settings, application manifests etc and directly requests elevation.「

(以下內容來自MSDN BLOG If I』m an Administrator, Why Do I Get Access Denied?)

如下截圖是末提權的管理員access token例子:

http://blogs.msdn.com/blogfiles/patricka/WindowsLiveWriter/ExplainUserAccountControlin10Minutes_A1CA/image_8.png

提權後的例子:

http://blogs.msdn.com/blogfiles/patricka/WindowsLiveWriter/ExplainUserAccountControlin10Minutes_A1CA/image_10.png

2、Windows是否有辦法實現類似於sudo的功能?

UAC目的是類似的。

4、再補充一個問題,就是關於CMD運行完成後就直接一閃而過,報錯的原因都來不及看,這種情況除了用截屏這種野路子,是否有更好的方法?

直接開個CMD然後運行你的程序即可

5、最後再補充個,我對Administrator已經解除登陸鎖了,那日常在Frank這個管理員賬戶下進行工作會有很大的安全風險嗎?

會的。推薦管理員工作賬戶和普通賬戶分開。


1、為什麼大家在管理員分組,而我卻不是「真正的」管理員。

許可權控制,為了安全,你在管理員組,需要管理員許可權的時候會提示你提權,不是管理員會提示你輸入管理員密碼

2、Windows是否有辦法實現類似於sudo的功能?

自動的

3、有沒有哪些資料是介紹Windows用戶許可權分配的?

不知道,搜搜KB吧

4、再補充一個問題,就是關於CMD運行完成後就直接一閃而過,報錯的原因都來不及看,這種情況除了用截屏這種野路子,是否有更好的方法?

先開cmd.再運行程序

5、最後再補充個,我對Administrator已經解除登陸鎖了,那日常在Frank這個管理員賬戶下進行工作會有很大的安全風險嗎?

沒看明白,有許可權控制,日常用administrator也沒什麼危險,別亂點確認就行。建議禁用默認管理員,或者更名。這樣有人黑你還要先知道你的用戶名才可以試你密碼


NTFS 的許可權管理機制是按用戶或按組分配,每個文件都有它的所有者以及一系列許可權分配(詳情可以看文件屬性里的安全選項卡),除非你想訪問的文件明確說明了 Administrators 組的用戶可以訪問,否則即使你屬於 Administrators 組也不能訪問。

所以從廣義上說,管理員和普通用戶沒啥區別,能否訪問完全是看 NTFS 上是怎麼定義許可權的,沒有真正意義上的管理員能有無限大的許可權。只是因為絕大多數系統文件都只允許諸如 SYSTEM、Administrator、TrustedInstaller 以及屬於 Administrators 組的用戶訪問,所以看上去這些用戶就是管理員用戶了。如果你把所有文件的許可權都設置成允許一個標準賬戶訪問,那麼這個標準賬戶就是事實上的管理員了。再假如你把一個文件的許可權設置成 Everyone 禁止訪問,那麼就算大到 SYSTEM 賬戶也無法訪問它,只能用諸如 Linux 下的 ntfs-3g 等脫離 NTFS 許可權監管的工具才能訪問。


1、為什麼大家在管理員分組,而我卻不是「真正的」管理員。

2、Windows是否有辦法實現類似於sudo的功能?

3、有沒有哪些資料是介紹Windows用戶許可權分配的?

這三個問題,本質上是Windows本地安全策略的限制,XP時代是沒有的,Vista以後才有。

我只說怎麼改吧:

開始-運行-gpedit.msc,左側樹形圖找到本地計算機策略-&>Windows設置-&>安全設置-&>本地策略-&>安全選項

按名稱排序,找到用戶賬戶控制的配置:

以管理員批准模式運行所有管理員:這個是題主你遇到的情況,明明是管理員,但默認行為不是管理員,把這個開關禁用,你操作的行為就跟XP是一樣的了(管理員的所有操作都以管理員許可權運行)

另外,「管理員批准模式中管理員的提升許可權提示」的行為也會影響一些。

其實正常情況下,不應該使用管理員賬戶操作Windows,這是微軟的本意,但很多軟體設計的不夠好,必須用管理員許可權,所以微軟在Vista以後加入UAC以及這個安全策略,所有涉及系統安全的動作都需要提權才行,其實就是把管理員給降級了,這也是沒辦法的事情,因為管理員賬戶被濫用了。

4、再補充一個問題,就是關於CMD運行完成後就直接一閃而過,報錯的原因都來不及看,這種情況除了用截屏這種野路子,是否有更好的方法?

1. 開一個cmd窗口運行;

2. 命令改成 cmd /k &<你的命令&>,運行完以後cmd窗口會保留,但如果程序本身另起一個控制台輸出的話則沒辦法了。

5、最後再補充個,我對Administrator已經解除登陸鎖了,那日常在Frank這個管理員賬戶下進行工作會有很大的安全風險嗎?

跟是否解鎖administrator沒關係,安全風險是由安全策略選項控制的,即使解鎖administrator,本地安全策略限制的話,這個賬戶一樣沒什麼大用途。

小提示:

「以管理員批准模式運行所有管理員」可以解決:

1. QQ遠程協助時無法控制某些窗口的問題;

2. 以管理員運行某些程序以後,無法拖動文件到窗口的問題;

但此種模式風險很大,一旦這麼改,Win7和XP就基本沒區別了。


@echo off

&>nul 2&>1 "%SYSTEMROOT%system32cacls.exe" "%SYSTEMROOT%system32configsystem"

if "%errorlevel%" NEQ "0" (

goto UACPrompt

) else ( goto gotAdmin )

:UACPrompt

echo Set UAC = CreateObject^("Shell.Application"^) &> "%temp%getadmin.vbs"

echo UAC.ShellExecute "%~s0", "", "", "runas", 1 &>&> "%temp%getadmin.vbs"

"%temp%getadmin.vbs"

exit /B

:gotAdmin

if exist "%temp%getadmin.vbs" ( del "%temp%getadmin.vbs" )

pushd "%CD%"

CD /D "%~dp0"

goto run

:run

:run後加cmd指令 有UAC提權對話框

2、提升為管理員或創建管理員

1、創建

@echo off

&>nul 2&>1 "%SYSTEMROOT%system32cacls.exe" "%SYSTEMROOT%system32configsystem"

if "%errorlevel%" NEQ "0" (

goto UACPrompt

) else ( goto gotAdmin )

:UACPrompt

echo Set UAC = CreateObject^("Shell.Application"^) &> "%temp%getadmin.vbs"

echo UAC.ShellExecute "%~s0", "", "", "runas", 1 &>&> "%temp%getadmin.vbs"

"%temp%getadmin.vbs"

exit /B

:gotAdmin

if exist "%temp%getadmin.vbs" ( del "%temp%getadmin.vbs" )

pushd "%CD%"

CD /D "%~dp0"

goto run

:run

set /p username=帳戶名:

set /p password=密碼:

net user %username% /del

net user %username% /add

net user %username% %password%

net localgroup administrators %username% /add

pause

2、提權

@echo off

&>nul 2&>1 "%SYSTEMROOT%system32cacls.exe" "%SYSTEMROOT%system32configsystem"

if "%errorlevel%" NEQ "0" (

goto UACPrompt

) else ( goto gotAdmin )

:UACPrompt

echo Set UAC = CreateObject^("Shell.Application"^) &> "%temp%getadmin.vbs"

echo UAC.ShellExecute "%~s0", "", "", "runas", 1 &>&> "%temp%getadmin.vbs"

"%temp%getadmin.vbs"

exit /B

:gotAdmin

if exist "%temp%getadmin.vbs" ( del "%temp%getadmin.vbs" )

pushd "%CD%"

CD /D "%~dp0"

goto run

:run

net localgroup administrators %username% /add


WINDOWS依賴token來標記當前用戶(實際上是當前線程)的許可權集合,從vista之後,引入UAC機制,就是每個token都生成另一個弱token,用來授權普通不敏感的操作,遇到敏感的操作,Windows希望確保這是經過用戶手工確認的操作,而不是程序自己偷偷摸摸地就把敏感的事幹了,經彈UAC用戶手動確認後,轉換為原始的強token,來授權敏感的操作。這其實是很重要的安全機制,與sudo本質上是一樣的。至於命令行的類似sudo的機制,要取決於目標程序的編譯選項,可以指定run as invoker還是require adminiatrator,後者會彈UAC讓用戶手動確認。希望解答題主的疑惑,小白文筆差,勿噴。


4. 應該在cmd窗口裡運行,而不是在win r里


2. 驅動 / ark工具


cmd一閃而過辦法:寫成bat腳本最後加個pause就行,我都這麼乾的


第四個問題大概可以使用 pause?


2,Windows實現sudo,

我最近在糾結Linux上的sudo,

雖然不懂Windows,但是感覺純圖形界面的Windows要搞個sudo應該很簡單,

管理員運行一個服務,收到命令就自己執行就可以了,


推薦閱讀:

Windows10的必裝軟體,推薦一下?
為什麼Win10總是刪除不了文件夾總是提示要管理員許可權?
win10其他瀏覽器能上網,edge和IE不能上網?
如何評價微軟在Windows10 Build 16273中引入的Bahnschrift字體?
Windows 是優秀的操作系統嗎?

TAG:MicrosoftWindows | Linux | 命令提示符cmd | PowerShell | Windows10 |