1. 程式人生 > >在Windows中實現sudo命令——命令列環境中獲取管理員許可權

在Windows中實現sudo命令——命令列環境中獲取管理員許可權

【說明】

        Windows系統從 Vista 版本開始加入了 UAC 機制,這導致沒有足夠許可權的程式無法獲取到一些關鍵資源。在 Linux 下我們可以使用 sudo 命令方便地提升當前程式的執行許可權,但在 Windows 中卻通常只能右鍵單擊程式圖示,再選擇 “以管理員身份執行”。這種必須使用滑鼠點選的方式很不方便,尤其在我們希望自動化執行一些任務時更是顯得礙手礙腳。

        我們可以自己寫一個執行在 Windows 系統的 sudo 命令工具。

【原始碼】

'ShellExecute 方法

'作用: 用於執行一個程式或指令碼。

'語法
'      .ShellExecute "application", "parameters", "dir", "verb", window
'      .ShellExecute 'some program.exe', '"some parameters with spaces"', , "runas", 1

'關鍵字
'   application   要執行的程式或指令碼名稱
'   parameters    執行程式或指令碼所需的引數
'   dir           工作路徑,若未指定則使用當前路徑
'   verb          要執行的動作 (值可以是 runas/open/edit/print)
'                   runas 動作通常用於提升許可權
'   window        程式或指令碼執行時的視窗樣式 (normal=1, hide=0, 2=Min, 3=max, 4=restore, 5=current, 7=min/inactive, 10=default)


Set UAC = CreateObject("Shell.Application")
Set Shell = CreateObject("WScript.Shell")
If WScript.Arguments.count<1 Then
    WScript.echo "語法:  sudo <command> [args]"
ElseIf WScript.Arguments.count=1 Then
    UAC.ShellExecute WScript.arguments(0), "", "", "runas", 1
'    WScript.Sleep 1500
'    Dim ret
'    ret = Shell.Appactivate("使用者賬戶控制")
'    If ret = true Then
'        Shell.sendkeys "%y"        
'    Else
'        WScript.echo "自動獲取管理員許可權失敗,請手動確認。"
'    End If
Else
    Dim ucCount
    Dim args
    args = NULL
    For ucCount=1 To (WScript.Arguments.count-1) Step 1
        args = args & " " & WScript.Arguments(ucCount)
    Next
    UAC.ShellExecute WScript.arguments(0), args, "", "runas", 5
End If

【效果】

        新建一個文字檔案,將上面程式碼複製貼上到檔案中,並重命名文字檔案為 sudo.vbs (注意字尾改成了 .vbs)。將 sudo.vbs 所在路徑新增到環境變數 PATH 中,這樣我們就可以在任意路徑下使用 sudo 命令獲取管理員許可權了。

        使用時我們可以在命令列輸入

        sudo  <command>  [args...]

效果如 圖1、圖2、圖3 所示:


圖1


圖2


圖3

【注意事項】

        這個 sudo 命令並不能直接獲取到管理員許可權,而只是在程式需要管理員許可權時自動彈出請求視窗,然後我們手動允許其以管理員許可權執行。

        如果有辦法獲取到 “使用者帳戶控制” 視窗的控制代碼,或者將焦點移動到 “使用者賬戶控制” 視窗,就可以直接自動獲取到管理員許可權。