Batch script: cách kiểm tra quyền quản trị


280

Làm cách nào để kiểm tra xem tập lệnh hiện tại có quyền quản trị viên không?

Tôi biết cách làm cho nó tự gọi bằng runas nhưng không biết cách kiểm tra quyền quản trị. Các giải pháp duy nhất tôi thấy là các công việc hack thô hoặc sử dụng các chương trình bên ngoài. Chà, thực sự tôi không quan tâm nếu đó là một công việc hack miễn là nó hoạt động trên Windows XP và mới hơn.


2
sau khi bạn có thể thay đổi quyền: [Cách yêu cầu quyền truy cập của Quản trị viên trong tệp bó] [1] [1]: stackoverflow.com/questions/1894967/
Kẻ



Câu trả lời:


465

Các vấn đề

Giải pháp của blak3r / Rushyo hoạt động tốt cho mọi thứ trừ Windows 8. Chạy ATtrên Windows 8 cho kết quả:

The AT command has been deprecated. Please use schtasks.exe instead.

The request is not supported.

(xem ảnh chụp màn hình số 1) và sẽ trở lại %errorLevel% 1.

 

Nghiên cứu

Vì vậy, tôi đã tìm kiếm các lệnh khác yêu cầu quyền nâng cao. ralityparanoid.com có một danh sách gồm một số, vì vậy tôi đã chạy từng lệnh trên hai thái cực đối lập của HĐH Windows hiện tại (XP và 8) với hy vọng tìm thấy lệnh sẽ bị từ chối truy cập trên cả hai HĐH khi chạy với quyền tiêu chuẩn.

Cuối cùng, tôi đã tìm thấy một - NET SESSION. Một giải pháp thực sự , sạch sẽ, phổ biến không liên quan đến:

  • việc tạo hoặc tương tác với dữ liệu ở các vị trí an toàn
  • phân tích dữ liệu trả về từ FORcác vòng lặp
  • chuỗi tìm kiếm cho "Quản trị viên"
  • sử dụng AT(Windows 8 không tương thích) hoặc WHOAMI(Windows XP không tương thích).

Mỗi trong số đó có các vấn đề bảo mật, khả năng sử dụng và tính di động riêng.

 

Kiểm tra

Tôi đã độc lập xác nhận rằng điều này hoạt động trên:

  • Windows XP, x86
  • Windows XP, x64
  • Windows Vista, x86
  • Windows Vista, x64
  • Windows 7, x86
  • Windows 7, x64
  • Windows 8, x86
  • Windows 8, x64
  • Windows 10 v1909, x64

(xem ảnh chụp màn hình # 2)

 

Thực hiện / Sử dụng

Vì vậy, để sử dụng giải pháp này, chỉ cần làm một cái gì đó như thế này:

@echo off
goto check_Permissions

:check_Permissions
    echo Administrative permissions required. Detecting permissions...

    net session >nul 2>&1
    if %errorLevel% == 0 (
        echo Success: Administrative permissions confirmed.
    ) else (
        echo Failure: Current permissions inadequate.
    )

    pause >nul

Có sẵn ở đây, nếu bạn lười biếng: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat

 

Giải trình

NET SESSIONlà một lệnh tiêu chuẩn được sử dụng để "quản lý các kết nối máy tính của máy chủ. Được sử dụng không có tham số, [nó] hiển thị thông tin về tất cả các phiên với máy tính cục bộ."

Vì vậy, đây là quá trình cơ bản của việc thực hiện đã cho của tôi:

  1. @echo off
    • Vô hiệu hóa hiển thị các lệnh
  2. goto check_Permissions
    • Chuyển đến :check_Permissionskhối mã
  3. net session >nul 2>&1
    • Chạy lệnh
    • Ẩn đầu ra trực quan của lệnh bằng
      1. Chuyển hướng STDOUTluồng đầu ra tiêu chuẩn (số xử lý số 1 / ) sangnul
      2. Chuyển hướng luồng đầu ra lỗi tiêu chuẩn (xử lý số 2 / STDERR) đến cùng đích với xử lý số 1
  4. if %errorLevel% == 0
    • Nếu giá trị của mã exit ( %errorLevel%) 0 sau đó phương tiện này mà không có lỗi đã xảy ra và, do đó, các lệnh trước đó ngay lập tức chạy thành công
  5. else
    • Nếu giá trị của mã thoát ( %errorLevel%) không phải 0 thì điều này có nghĩa là đã xảy ra lỗi và do đó, lệnh trước đó đã chạy không thành công
  6. Mã giữa dấu ngoặc đơn tương ứng sẽ được thực thi tùy thuộc vào tiêu chí nào được đáp ứng

 

Ảnh chụp màn hình

Windows 8AT %errorLevel% :

[imgur]

 

NET SESSIONtrên Windows XP x86 - Windows 8 x64 :

[imgur]

 

Cảm ơn bạn, @Tilka, vì đã thay đổi câu trả lời được chấp nhận của bạn cho tôi. :)


12
+1 Công việc tuyệt vời! Nghiên cứu tốt. Bài viết của bạn nên xứng đáng là câu trả lời mới được chấp nhận.
blak3r

13
Giải pháp này thường hoạt động rất tốt, nhưng nếu dịch vụ "Máy chủ" (LanmanServer) bị dừng, mã lỗi cho "Dịch vụ máy chủ chưa được khởi động" là mã lỗi tương tự mà bạn nhận được cho "Truy cập bị từ chối" dẫn đến âm tính giả . Nói cách khác, có những trường hợp bạn có thể chạy kiểm tra này với các đặc quyền quản trị và nó sẽ trả về cùng một lỗi như không có các đặc quyền đó.
Lectrode

3
@Lectrode Tôi đã đăng một giải pháp thay thế không có cùng một vấn đề: stackoverflow.com/questions/4051883/iêu
và31415

8
Mã này trả về dương tính giả (ít nhất là trên Windows 7) nếu người dùng là Người dùng quyền lực. Người dùng quyền lực cũng có thể "nâng cao" và sau đó chạy net sessionthành công (ERRORLEVEL = 0) - nhưng họ thực sự không có quyền quản trị. Sử dụng openfiles(xem câu trả lời của Lucretius bên dưới) không có vấn đề này.
EM0

1
Điều này sẽ treo lời nhắc nếu thiết bị mạng không hoạt động hoàn toàn (ví dụ: gỡ lỗi Windows). fltmc> nul 2> & 1 hoạt động tốt hơn trong vấn đề đó.
kevinf

80

Giải pháp của Anders đã làm việc cho tôi nhưng tôi không chắc chắn làm thế nào để đảo ngược nó để làm điều ngược lại (khi bạn không phải là quản trị viên).

Đây là giải pháp của tôi. Nó có hai trường hợp một trường hợp IF và ELSE, và một số nghệ thuật ascii để đảm bảo mọi người thực sự đọc nó. :)

Phiên bản tối thiểu

Rushyo đã đăng giải pháp này tại đây: Làm thế nào để phát hiện nếu CMD đang chạy với tư cách Quản trị viên / có đặc quyền nâng cao?

NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
    ECHO NOT AN ADMIN!
)

Phiên bản có thêm thông báo lỗi, tạm dừng và thoát

@rem ----[ This code block detects if the script is being running with admin PRIVILEGES If it isn't it pauses and then quits]-------
echo OFF
NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
   echo ######## ########  ########   #######  ########  
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ######   ########  ########  ##     ## ########  
   echo ##       ##   ##   ##   ##   ##     ## ##   ##   
   echo ##       ##    ##  ##    ##  ##     ## ##    ##  
   echo ######## ##     ## ##     ##  #######  ##     ## 
   echo.
   echo.
   echo ####### ERROR: ADMINISTRATOR PRIVILEGES REQUIRED #########
   echo This script must be run as administrator to work properly!  
   echo If you're seeing this after clicking on a start menu icon, then right click on the shortcut and select "Run As Administrator".
   echo ##########################################################
   echo.
   PAUSE
   EXIT /B 1
)
@echo ON

Hoạt động trên WinXP -> Win8 (bao gồm các phiên bản 32/64 bit).

EDIT: 28/11/2012 Đã cập nhật để hỗ trợ Windows 8. @BenHooper đã chỉ ra điều này trong câu trả lời của anh ấy bên dưới. Hãy nêu lên câu trả lời của anh ấy.


1
ATkhông hoạt động trên Windows 8, nhưng tôi đã tìm thấy một giải pháp tốt hơn. Tôi đã đăng nó như một câu trả lời ở đây, trên thực tế: stackoverflow.com/questions/4051883/ (hoặc bạn có thể chỉ cần cuộn xuống, bất cứ điều gì).
huyền thoại

1
Tôi tự hỏi nếu hai dòng if% errorLevel% == / THIẾT BỊ trên khối mã đầu tiên là TYPO .. vui lòng sửa lại.
Ujjwal Singh

@UjjwalSingh Chắc chắn là như vậy. Cảm ơn đã bắt. Tôi đã cập nhật nó.
blak3r

Có thể muốn thay thế "Rushyo đăng giải pháp này tại đây" bằng nhận xét của bạn về tôi khi bạn đang sử dụng giải pháp của tôi? :)
huyền thoại

Không hoạt động cho Nhóm Quản trị viên tên miền được thêm vào Nhóm quản trị viên trong máy cục bộ và đăng nhập với người dùng Quản trị viên tên miền.
MCRohith

46

Nhiều vấn đề hơn

Như @Lectrode đã chỉ ra, nếu bạn cố chạy net sessionlệnh trong khi dịch vụ Máy chủ bị dừng, bạn sẽ nhận được thông báo lỗi sau:

The Server service is not started.

More help is available by typing NET HELPMSG 2114

Trong trường hợp này, %errorLevel%biến sẽ được đặt thành 2.

Lưu ý Dịch vụ máy chủ không được khởi động khi ở Chế độ an toàn (có hoặc không có kết nối mạng).

Tìm kiếm một sự thay thế

Một cái gì đó:

  • có thể hết hộp trên Windows XP trở lên (32 và 64 bit);
  • không chạm vào sổ đăng ký hoặc bất kỳ tập tin / thư mục hệ thống;
  • hoạt động bất kể ngôn ngữ hệ thống;
  • cho kết quả chính xác ngay cả trong Chế độ an toàn.

Vì vậy, tôi đã khởi động một máy ảo Windows XP vanilla và tôi bắt đầu cuộn qua danh sách các ứng dụng trong C:\Windows\System32thư mục, cố gắng để có được một số ý tưởng. Sau các thử nghiệm và sai sót, đây là cách tiếp cận bẩn (ý định chơi chữ) mà tôi đã nghĩ ra:

fsutil dirty query %systemdrive% >nul

Các fsutil dirtylệnh đòi hỏi quyền quản trị để chạy, và sẽ thất bại khác. %systemdrive%là một biến môi trường trả về ký tự ổ đĩa nơi hệ điều hành được cài đặt. Đầu ra được chuyển hướng đến nul, do đó bỏ qua. Các %errorlevel%biến sẽ được thiết lập để 0chỉ khi thực hiện thành công.

Đây là những gì tài liệu nói:

Fsutil bẩn

Truy vấn hoặc đặt bit bẩn của âm lượng. Khi bit bẩn của âm lượng được đặt, autochk sẽ tự động kiểm tra lỗi âm lượng vào lần tiếp theo máy tính được khởi động lại.

Cú pháp

fsutil dirty {query | set} <VolumePath>

Thông số

query           Queries the specified volume's dirty bit.
set             Sets the specified volume's dirty bit.
<VolumePath>    Specifies the drive name followed by a colon or GUID.

Nhận xét

Một bit bẩn của một khối lượng chỉ ra rằng hệ thống tập tin có thể ở trạng thái không nhất quán. Bit bẩn có thể được đặt vì:

  • Âm lượng là trực tuyến và nó có những thay đổi nổi bật.
  • Thay đổi được thực hiện cho âm lượng và máy tính đã tắt trước khi thay đổi được cam kết vào đĩa.
  • Tham nhũng được phát hiện trên khối lượng.

Nếu bit bẩn được đặt khi máy tính khởi động lại, chkdsk chạy để xác minh tính toàn vẹn của hệ thống tệp và cố gắng khắc phục mọi sự cố với âm lượng.

Ví dụ

Để truy vấn bit bẩn trên ổ C, gõ:

fsutil dirty query C:

Nghiên cứu thêm

Mặc dù giải pháp trên hoạt động từ Windows XP trở đi, nhưng đáng để thêm rằng Windows 2000 và Windows PE (Môi trường được cài đặt sẵn) không đi kèm fsutil.exe, vì vậy chúng tôi phải dùng đến một thứ khác.

Trong các thử nghiệm trước đây của tôi, tôi nhận thấy rằng việc chạy sfclệnh mà không có bất kỳ tham số nào cũng sẽ dẫn đến:

  • một lỗi, nếu bạn không có đủ đặc quyền;
  • một danh sách các tham số có sẵn và cách sử dụng của chúng.

Đó là: không tham số, không tiệc tùng . Ý tưởng là chúng ta có thể phân tích cú pháp đầu ra và kiểm tra xem chúng ta có lỗi gì không:

sfc 2>&1 | find /i "/SCANNOW" >nul

Đầu ra lỗi đầu tiên được chuyển hướng đến đầu ra tiêu chuẩn, sau đó được dẫn đến findlệnh. Tại thời điểm này, chúng tôi phải tìm tham số duy nhất được hỗ trợ trong tất cả các phiên bản Windows kể từ Windows 2000 : /SCANNOW. Tìm kiếm không phân biệt chữ hoa chữ thường và đầu ra bị loại bỏ bằng cách chuyển hướng nó đến nul.

Đây là một đoạn trích từ tài liệu:

Sfc

Quét và xác minh tính toàn vẹn của tất cả các tệp hệ thống được bảo vệ và thay thế các phiên bản không chính xác bằng các phiên bản chính xác.

Nhận xét

Bạn phải đăng nhập với tư cách là thành viên của nhóm Quản trị viên để chạy sfc.exe .

Sử dụng mẫu

Dưới đây là một số ví dụ dán và chạy:

Windows XP trở lên

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b

Windows 2000 / Windows PE

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
sfc 2>&1 | find /i "/SCANNOW" >nul
exit /b

Áp dụng cho

  • Windows 2000
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
  • Windows 8.1
    ---
  • Windows PE

1
+1 Giải pháp tuyệt vời. Giải pháp SFC nói riêng dường như là một kiểm tra đáng tin cậy cho tất cả các hệ điều hành được đề cập. Nếu tôi gặp bất kỳ vấn đề nào bằng cách sử dụng một trong hai vấn đề này, tôi sẽ báo cáo chúng ở đây.
Lectrode

1
Đối với bất kỳ ai đang tìm cách sử dụng SFCkiểm tra cho tất cả các hệ thống, bạn cần có một chút sáng tạo. Vì một số lý do, bắt đầu với Windows 8 chỉ SFCxuất ra các ký tự đơn. Để phân tích thành công đầu ra, bạn cần làm như sau: setlocal enabledelayedexpansion for /f "tokens=* delims=" %%s in ('sfc 2^>^&1^|MORE') do @set "output=!output!%%s" echo "%output%"|findstr /I /C:"/scannow">nul 2>&1(3 dòng riêng biệt). Điều này sẽ hoạt động trên Windows 2000 đến Windows 2012 R2. Bên cạnh đó, tôi thích FINDSTR hơn vì nó thường xử lý mọi thứ nhanh hơn TÌM.
Lectrode

Công việc tuyệt vời, @ and31415! Cá nhân tôi chưa thử nghiệm fsutilgiải pháp của bạn nhưng, từ những gì tôi có thể thấy, nó có vẻ linh hoạt hơn nhiều so với giải pháp của tôi. Mặc dù, không hoàn toàn thanh lịch, có thể. ;) Tôi rất vui khi thấy rằng, giữa chúng tôi, chúng tôi đang nhận được một giải pháp phát hiện quản trị tuyệt vời, dễ dàng và linh hoạt được ghim xuống. :)
huyền thoại

1
Khi chạy FSUTIL, bạn có thể bỏ ký tự ổ đĩa và chỉ chạy fsutil dirty query >nulkhi nâng lên, nó sẽ trả về một số văn bản trợ giúp và% errorlevel% = 0
SS64

4
@ ss64 Windows 10 không còn trả về mức độ lỗi khác fsutil dirty query >nul, tuy nhiên fsutil dirty query %systemdrive% >nulvẫn hoạt động
bcrist

19

hai cách nữa - tương thích nhanh và ngược.

fltmc >nul 2>&1 && (
  echo has admin permissions
) || (
  echo has NOT admin permissions
)

fltmc lệnh có sẵn trên mọi hệ thống windows kể từ XP, vì vậy đây sẽ là một thiết bị di động.


Một giải pháp nữa rất nhanh thử nghiệm trên XP, 8.1, 7 - có một cụ thể biến =::được trình bày chỉ khi Console Session không có privileges.As admin nó không phải là dễ dàng như vậy để tạo ra biến có chứa =trong nó tên này là cách tương đối đáng tin cậy để kiểm tra cho admin sự cho phép (nó không gọi các tệp thực thi bên ngoài để nó hoạt động tốt)

setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! ( 
   echo has NOT admin permissions
) else (
   echo has admin permissions
)

Nếu bạn muốn sử dụng trực tiếp thông qua dòng lệnh, nhưng không phải từ tệp bó, bạn có thể sử dụng:

set ^"|find "::"||echo has admin permissions

Sử thi ... Liệu giải pháp "dv == ::" có bất kỳ nhược điểm / hạn chế nào không?
script'n'code

Vâng, vì một số lý do! Dv! Phương thức luôn nói tôi là Quản trị viên, trong khi tôi không nhấp chuột phải vào "Chạy với tư cách Quản trị viên" tệp bó (Windows 10). Tôi thực sự nghĩ rằng phương pháp này là hoàn hảo. Tôi thích phương pháp này vì nó không phụ thuộc vào các chương trình bên ngoài. Bây giờ tôi buồn và tôi không biết điều gì làm cho nó thất bại / không đáng tin đối với tôi :(
script'n'code

1
@copyitright - Tôi không có máy win10 để kiểm tra nó ở đó :(. Mặc dù sự tồn tại của =::biến là một lỗi - nó đại diện cho một ổ đĩa không tồn tại, vì vậy có lẽ nó đã được sửa trong win10.
npocmaka

Có lẽ họ đã vá nó rồi. Đó là niềm vui trong khi nó kéo dài.
script'n'code

1
Tôi thấy =::được định nghĩa cho không phải quản trị viên CMD trên windows 10 1709. Dù sao đó không phải là một cách đáng tin cậy, bạn có thể dễ dàng buộc nó được xác định ngay cả trên các phiên quản trị CMD:subst :: c:\ & for %a in (::) do %a & set,
sst

17
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)

1
Có vẻ như trong một số trường hợp, bài kiểm tra luôn thất bại, ngay cả sau khi được nâng lên. Trong trường hợp của tôi khi kịch bản được gọi bởi ứng dụng của tôi.
boileau

15

giải pháp thay thế:

@echo off
pushd %SystemRoot%
openfiles.exe 1>nul 2>&1
if not %errorlevel% equ 0 (
    Echo here you are not administrator!
) else (
    Echo here you are administrator!
)
popd
Pause

7
Bạn có thể thêm một lời giải thích cho câu trả lời của bạn?
bjb568

4
Trong khi mã này có thể trả lời câu hỏi, bạn nên thêm một số giải thích về lý do tại sao nó làm như vậy.
PlasmaHH

2
Đúng! Điều này hoạt động chính xác ngay cả khi người dùng là Người dùng quyền lực (không giống như "phiên net"). Không cần cho Pushd / popd, mặc dù. Chỉ cần chạy openfilesvà kiểm tra ERRORLEVEL là đủ.
EM0

2
Tôi đã sử dụng giải pháp này và nó đã hoạt động tốt. Vấn đề là openfiles.exenó không hoạt động trong WinPE, vì vậy tập lệnh sẽ luôn trả về rằng người dùng không phải là quản trị viên.
Wayfarer

Tài liệu cho openfiles.exe có thể được tìm thấy trên technet.microsoft.com/de-de/l Library / bb490961.aspx . 1>2>&1được giải thích trên microsoft.com/resource/documentation/windows/xp/all/proddocs/ mẹo . nulđề cập đến thiết bị null
user1460043

13

Không chỉ kiểm tra mà NHẬN quyền quản trị tự động
hay còn gọi là UAC tự động cho Win 7/8 / 8.1 ff.
: Dưới đây là một tính năng thực sự thú vị với một tính năng nữa: Đoạn mã này không chỉ kiểm tra quyền quản trị mà còn tự động nhận chúng! (và kiểm tra trước, nếu sống trên HĐH có khả năng UAC.)

Với thủ thuật này, bạn không cần lâu hơn để quyền klick trên tệp bó của mình "với quyền quản trị". Nếu bạn đã quên, để bắt đầu với quyền nâng cao, UAC sẽ tự động xuất hiện! Hơn nữa, lúc đầu, nó đã được thử nghiệm, nếu HĐH cần / cung cấp UAC, do đó, nó hoạt động chính xác, ví dụ như Win 2000 / XP cho đến khi Win 8.1- được thử nghiệm.

@echo off
REM Quick test for Windows generation: UAC aware or not ; all OS before NT4 ignored for simplicity
SET NewOSWith_UAC=YES
VER | FINDSTR /IL "5." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO
VER | FINDSTR /IL "4." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO


REM Test if Admin
CALL NET SESSION >nul 2>&1
IF NOT %ERRORLEVEL% == 0 (

    if /i "%NewOSWith_UAC%"=="YES" (
        rem Start batch again with UAC
        echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
        echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
        "%temp%\getadmin.vbs"
        del "%temp%\getadmin.vbs"
        exit /B
    )

    rem Program will now start again automatically with admin rights! 
    rem pause
    goto :eof
)

Đoạn mã hợp nhất một số mẫu lô tốt với nhau, đặc biệt là (1) thử nghiệm quản trị viên trong chủ đề này của Ben Hooper và (2) kích hoạt UAC đọc trên BatchGotAdmin và được trích dẫn trên trang web của lô bởi robvanderwoude (tôn trọng). (3) Đối với hệ điều hành nhận dạng hệ điều hành theo "mẫu | | TÌM KIẾM" Tôi chỉ không tìm thấy tài liệu tham khảo.)

(Liên quan đến một số hạn chế rất nhỏ, khi "NET SESSION" không hoạt động như được đề cập trong câu trả lời khác - hãy thoải mái chèn một lệnh khác. Đối với tôi chạy trong chế độ an toàn Windows hoặc các dịch vụ tiêu chuẩn đặc biệt và đó không phải là trường hợp sử dụng quan trọng - đối với một số quản trị viên có thể họ là.)


Điều đó thật tuyệt! Lưu ý một điều - gọi nó từ Visual Basic hoạt động như thế start- nó mở tập lệnh trong một cửa sổ mới. Nếu bạn muốn xem kết quả - thêm một pausephần cuối tập lệnh của bạn. Ngoài ra, thật khó để phát hiện, khi chúng tôi "ở lại" trên cao và khi có chạy lại. Bạn có thể sử dụng một đối số dòng lệnh cho điều đó: github.com/tgandor/meats/blob/master/lang_lawyer/cmd/
Kẻ

@Philm: Nếu UAC yêu cầu người dùng nhập mật khẩu của họ thì sao? Tôi cho rằng mã này sẽ không cung cấp cho họ quyền Quản trị viên tự động mà không cần người dùng nhập mật khẩu của họ trước ;-)
script'n'code

@copyitright. Tất nhiên là không rồi. Nhưng nếu mật khẩu cần thiết hay không không phải là một sự khác biệt ở đây: Tất nhiên ý tôi là "tự động" là kịch bản kích hoạt Windows để ASK tự động cho các quyền chứ không phải nhiều hơn. Nếu không có cấu trúc như thế này, tập lệnh bó sẽ thất bại, nếu được bắt đầu bằng cách nhấp đúp hoặc tương tự. Để tránh điều đó, người dùng sẽ phải biết trước rằng tập lệnh yêu cầu quyền nâng cao và phải bắt đầu nó như thế.
Philm

Vì vậy, tập lệnh của tôi chỉ cho phép tác giả của một tệp bó thay đổi thời điểm độ cao cần thiết thành một điểm trong quá trình thực thi lô mà họ muốn. Hay nói cách khác: Để cho phép thực thi thuận tiện hơn bằng "doubleclick" thông thường. Bởi vì tôi đã xem xét các lô như vậy thường được sử dụng bởi các chuyên gia hoặc người dùng có kiến ​​thức rất tốt về công nghệ Windows cơ bản, tôi đã không giải thích chi tiết về điều đó.
Philm

12

Tôi có hai cách kiểm tra quyền truy cập đặc quyền, cả hai đều khá đáng tin cậy và rất dễ mang theo trên hầu hết mọi phiên bản windows.

1. Phương pháp

set guid=%random%%random%-%random%-%random%-%random%-%random%%random%%random%

mkdir %WINDIR%\%guid%>nul 2>&1
rmdir %WINDIR%\%guid%>nul 2>&1

IF %ERRORLEVEL%==0 (
    ECHO PRIVILEGED!
) ELSE (
    ECHO NOT PRIVILEGED!
)

Đây là một trong những phương pháp đáng tin cậy nhất, vì tính đơn giản của nó và hành vi của lệnh rất nguyên thủy này rất khó thay đổi. Đó không phải là trường hợp của các công cụ CLI tích hợp khác như phiên net có thể bị vô hiệu hóa bởi chính sách quản trị / mạng hoặc các lệnh như fsutils đã thay đổi đầu ra trên Windows 10.

* Hoạt động trên XP trở lên

2. Phương pháp

REG ADD HKLM /F>nul 2>&1

IF %ERRORLEVEL%==0 (
    ECHO PRIVILEGED!
) ELSE (
    ECHO NOT PRIVILEGED!
)

Đôi khi bạn không thích ý tưởng chạm vào đĩa người dùng, ngay cả khi nó không gây khó chịu như sử dụng fsutils hoặc tạo một thư mục trống, điều đó không thể chứng minh được nhưng nó có thể dẫn đến một thất bại thảm hại nếu xảy ra sự cố. Trong trường hợp này, bạn chỉ có thể kiểm tra sổ đăng ký cho các đặc quyền.

Để làm điều này, bạn có thể thử tạo một khóa trên HKEY_LOCAL_MACHINE bằng các quyền mặc định, bạn sẽ nhận được Access DeniedERRORLEVEL == 1, nhưng nếu bạn chạy với tư cách Quản trị viên, nó sẽ in "lệnh được thực hiện thành công"ERRORLEVEL == 0. Vì khóa đã tồn tại nên nó không có tác dụng đối với sổ đăng ký. Đây có lẽ là cách nhanh nhất và REG tồn tại trong một thời gian dài.

* Không khả dụng trên NT trước (Win 9X).

* Hoạt động trên XP trở lên


Ví dụ làm việc

Một tập lệnh xóa thư mục tạm thời


1
Tôi thực sự thích phương thức đăng ký. Tôi thực sự có thể nhớ nó, không phải tìm kiếm nó mỗi khi tôi sử dụng nó.
Linh tinh

8

Trong tập lệnh batch Elevate.cmd (xem liên kết này ), mà tôi đã viết để có quyền quản trị , tôi đã thực hiện theo cách sau:

:checkPrivileges
  NET FILE 1>NUL 2>NUL
  if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )

Điều này đã được thử nghiệm cho Windows 7, 8, 8.1, 10 và thậm chí Windows XP và không cần bất kỳ tài nguyên nào như thư mục, tệp hoặc khóa đăng ký đặc biệt.


6

Cách sạch nhất để kiểm tra các đặc quyền của quản trị viên bằng cách sử dụng tập lệnh CMD mà tôi đã tìm thấy là một cái gì đó như sau:

@echo off

REM  Calling verify with no args just checks the verify flag,
REM   we use this for its side effect of setting errorlevel to zero
verify >nul

REM  Attempt to read a particular system directory - the DIR
REM   command will fail with a nonzero errorlevel if the directory is
REM   unreadable by the current process.  The DACL on the
REM   c:\windows\system32\config\systemprofile directory, by default,
REM   only permits SYSTEM and Administrators.
dir %windir%\system32\config\systemprofile >nul 2>nul

REM  Use IF ERRORLEVEL or %errorlevel% to check the result
if not errorlevel 1 echo has Admin privs
if     errorlevel 1 echo has only User privs

Phương pháp này chỉ sử dụng các nội dung của CMD.exe, vì vậy nó sẽ rất nhanh. Nó cũng kiểm tra các khả năng thực tế của quy trình thay vì kiểm tra SID hoặc tư cách thành viên nhóm, vì vậy sự cho phép hiệu quả được kiểm tra. Và điều này hoạt động trở lại như Windows 2003 và XP. Các quy trình người dùng thông thường hoặc các quy trình không liên quan đều thất bại trong việc thăm dò thư mục, khi quá trình Quản trị viên hoặc nâng cao thành công.


1
copyitright chỉ ra rằng điều này là không đáng tin cậy. Nếu bạn truy cập% Windir% \ system32 \ config \ systemprofile trong cửa sổ Explorer và phê duyệt với UAC, cửa sổ CMD có thể điều hướng thành công nội dung. Dẫn đến bạn nghĩ rằng bạn có độ cao khi bạn không.
Tyler Szabo

5

Sau đây cố gắng tạo một tệp trong thư mục Windows. Nếu nó thành công nó sẽ loại bỏ nó.

copy /b/y NUL %WINDIR%\06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 >NUL 2>&1
if errorlevel 1 goto:nonadmin
del %WINDIR%\06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 >NUL 2>&1
:admin
rem here you are administrator
goto:eof
:nonadmin
rem here you are not administrator
goto:eof

Lưu ý rằng 06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 là một GUID được tạo ra ngày hôm nay và nó được coi là không thể xung đột với tên tệp hiện có.


+1 vì câu trả lời được chấp nhận khiến vô số cửa sổ lệnh được mở khi tập lệnh được gọi từ ứng dụng của tôi.
boileau

was generated today and it is assumed to be improbable to conflict with an existing filename.ngoại trừ nếu hai người sử dụng mã này
Vitim.us

4

Whoami / nhóm không hoạt động trong một trường hợp. Nếu bạn đã tắt hoàn toàn UAC (không chỉ tắt thông báo) bạn đã bắt đầu từ lời nhắc của Quản trị viên rồi ban hành:

runas /trustlevel:0x20000 cmd

bạn sẽ chạy không tăng, nhưng ban hành:

whoami /groups

sẽ nói bạn được nâng lên. Nó sai. Đây là lý do tại sao nó sai:

Khi chạy ở trạng thái này, nếu IsUserAdmin ( https://msdn.microsoft.com/en-us/l Library / windows / desktop / aa376389 (v = vs85) .aspx ) trả về FALSE và UAC bị vô hiệu hóa hoàn toàn và GetTokenInform trả về TokenElevationTypeDefault ( http://blogs.msdn.com/b/cjacks/archive/2006/10/24/modifying-the-mandatory-integrity-level-for-a-securable-object-in-windows-vista.aspx ) sau đó quá trình không chạy cao, nhưng whoami /groupstuyên bố nó là.

thực sự, cách tốt nhất để làm điều này từ một tệp bó là:

net session >nul 2>nul
net session >nul 2>nul
echo %errorlevel%

Bạn nên làm net sessionhai lần vì nếu ai đó làm attrước, bạn sẽ nhận được thông tin sai.


whoami /groupskhông cung cấp thông tin sai. Chỉ là điều đó runas /trustlevelđặt bạn vào một nơi không mong đợi: chạy mà không có đặc quyền của quản trị viên nhưng với mức độ toàn vẹn cao. Bạn có thể xác nhận điều này với Process Explorer. (Đây có thể là một lỗi trong runasnhưng không phải là lỗi trong whoami.)
Harry Johnston

Harry, tôi nghe thấy những gì bạn nói, nhưng bạn có thể giải thích về điều này? Tôi không hiểu nhận xét liên quan đến runas /trustlevel Khi bạn là quản trị viên cục bộ và UAC bị vô hiệu hóa, việc ban hành lệnh runas từ dấu nhắc quản trị viên sẽ đưa bạn vào bối cảnh bảo mật "người dùng cơ bản". Trong khi ở chế độ đó, bạn không thể thực hiện các thao tác quản trị. Hãy thử "phiên net" hoặc fsutil "hoặc bất kỳ tiện ích nào khác yêu cầu quyền truy cập của quản trị viên. Tuy nhiên," whoami / nhóm "cho bạn biết bạn đã nâng cao. Khi bạn không. Thực tế là việc gọi GetTokenIn information trả về" TokenElevationTypeDefault "cho biết điều đó.
bảo vệ zumalififard

Tôi không chắc rằng tôi hiểu ý của bạn là gì bởi "whoami / nhóm nói với bạn rằng bạn được nâng lên"; nó không thực sự xuất ra chuỗi "bạn đang nâng", phải không? Phần nào của đầu ra của whoami / nhóm bạn đang xem?
Harry Johnston

Harry, tôi thấy tôi đã không rõ ràng. Nền đầu tiên, vì vậy bạn và tôi ở trên cùng một trang. có một số mẹo mà mọi người sử dụng để xác định xem dấu nhắc lệnh hiện có đang chạy trong trạng thái có quyền truy cập của quản trị viên hay không. Các kỹ thuật phổ biến là sử dụng lệnh được xây dựng như fsutil, at, whoami và "net session". Sử dụng "tại" không được dùng nữa. Nếu bạn tìm kiếm trang này, bạn sẽ thấy các ví dụ sử dụng fsutil, whoami và "phiên net". Xem tại đây để biết thêm ví dụ về whoami: stackoverflow.com/questions/7985755/ cấp
zumalifeguard

Ngoài ra, sử dụng cụm từ "chạy cao" không chính xác. Những gì tôi (và những người khác) nên nói "chạy với đặc quyền quản trị viên". Nếu UAC bị tắt, điều đó chỉ đơn giản là chạy trong khi đăng nhập với tư cách quản trị viên cục bộ nhưng không hạ thấp mức độ tin cậy rõ ràng như với runas. Khi UAC được bật, điều này có nghĩa là người dùng đang chạy trong một dấu nhắc nâng cao.
bảo vệ zumalififard

2
whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
  echo ...  connected as admin
)

2
Vấn đề ở đây là, bạn kiểm tra xem người dùng có quyền quản trị hay không. Nhưng tập lệnh bó có thể chạy mà không có quyền quản trị.
tanascius

2
Plus whoamikhông được hỗ trợ trong Windows XP.
huyền thoại

Ngoài ra whoami / nhóm có một trường hợp cạnh mà bạn nhận được thông tin sai. Xem stackoverflow.com/questions/4051883/
Mạnh

2

Một số máy chủ vô hiệu hóa các dịch vụ mà lệnh "phiên net" yêu cầu. Kết quả này trong kiểm tra quản trị viên luôn nói rằng bạn không có quyền quản trị khi bạn có thể có.


2

Chỉnh sửa: copyitright đã chỉ ra rằng điều này là không đáng tin cậy. Phê duyệt quyền truy cập đọc với UAC sẽ cho phép dir thành công. Tôi có thêm một chút kịch bản để đưa ra một khả năng khác, nhưng nó không chỉ đọc.

reg query "HKLM\SOFTWARE\Foo" >NUL 2>NUL && goto :error_key_exists
reg add "HKLM\SOFTWARE\Foo" /f >NUL 2>NUL || goto :error_not_admin
reg delete "HKLM\SOFTWARE\Foo" /f >NUL 2>NUL || goto :error_failed_delete
goto :success

:error_failed_delete
  echo Error unable to delete test key
  exit /b 3
:error_key_exists
  echo Error test key exists
  exit /b 2
:error_not_admin
  echo Not admin
  exit /b 1
:success
  echo Am admin

Câu trả lời cũ dưới đây

Cảnh báo: không đáng tin cậy


Dựa trên một số câu trả lời hay khác ở đây và những điểm được đưa ra bởi and31415 tôi thấy rằng tôi là một người hâm mộ sau đây:

dir "%SystemRoot%\System32\config\DRIVERS" 2>nul >nul || echo Not Admin

Ít phụ thuộc và nhanh chóng.


1
Giải pháp này được sử dụng để làm việc cho tôi nhưng vì tôi đã duyệt đến vị trí và truy cập thư mục mà bạn cần đặc quyền nâng cao, mã ERRORLEVEL / thoát luôn luôn là 0, mặc dù chạy tập lệnh như người dùng chuẩn.
script'n'code

1

Lưu ý: Việc kiểm tra các cacls cho \ system32 \ config \ system sẽ LUÔN thất bại trong WOW64, (ví dụ: từ% systemroot% \ syswow64 \ cmd.exe / 32 bit Total Commander) để các tập lệnh chạy trong trình bao 32 bit trong hệ thống 64 bit sẽ lặp lại mãi mãi ... Tốt hơn nên kiểm tra quyền trên thư mục Prefetch:

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\Prefetch\"

Đã thử nghiệm Win XP đến 7, tuy nhiên nó không thành công trong WinPE vì trong windows 7 install.wim không có thư mục nào cũng như cacls.exe

Ngoài ra trong winPE VÀ wow64 không kiểm tra với openfiles.exe:

OPENFILES > nul

Trong Windows 7, nó sẽ báo lỗi với "1" với thông tin rằng "Hệ thống đích cần phải là hệ điều hành 32 bit"

Cả hai kiểm tra có thể cũng sẽ thất bại trong giao diện điều khiển phục hồi.

Những gì hoạt động trong Windows XP - 8 32/64 bit, trong WOW64 và trong WinPE là: kiểm tra tạo thư mục (NẾU quản trị viên đã không ném bom thư mục Windows với quyền cho mọi người ...) và

net session

reg add HKLM /F

Séc.

Ngoài ra, một lưu ý nữa trong một số Windows XP (và các phiên bản khác có thể cũng vậy, tùy thuộc vào sự mày mò của quản trị viên) tùy thuộc vào các mục đăng ký gọi trực tiếp bat / cmd từ tập lệnh .vbs sẽ thất bại với thông tin rằng các tập tin bat / cmd không được liên kết với bất cứ điều gì ...

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo

Gọi cmd.exe với tham số của tập tin bat / cmd mặt khác hoạt động tốt:

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", "/C %~s0", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo

1

Nghĩa đen là hàng tá câu trả lời trong câu hỏi này và các câu hỏi được liên kết và các câu hỏi khác tại SE, tất cả đều thiếu theo cách này hay cách khác, đã cho thấy rõ rằng Windows không cung cấp tiện ích bảng điều khiển tích hợp đáng tin cậy. Vì vậy, đã đến lúc bạn tự tung ra.

Mã C sau, dựa trên Phát hiện nếu chương trình đang chạy với quyền quản trị viên đầy đủ , hoạt động trong Win2k + 1 , ở mọi nơi và trong mọi trường hợp (UAC, tên miền, nhóm chuyển tiếp ...) - vì nó hoạt động giống như chính hệ thống khi nó kiểm tra quyền Nó báo hiệu kết quả cả bằng một thông báo (có thể bị tắt tiếng bằng một công tắc) và mã thoát.

Nó chỉ cần được biên dịch một lần, sau đó bạn có thể sao chép .exemọi nơi - nó chỉ phụ thuộc vào kernel32.dlladvapi32.dll(tôi đã tải lên một bản sao ).

chkadmin.c:

#include <malloc.h>
#include <stdio.h>
#include <windows.h>
#pragma comment (lib,"Advapi32.lib")

int main(int argc, char** argv) {
    BOOL quiet = FALSE;
    DWORD cbSid = SECURITY_MAX_SID_SIZE;
    PSID pSid = _alloca(cbSid);
    BOOL isAdmin;

    if (argc > 1) {
        if (!strcmp(argv[1],"/q")) quiet=TRUE;
        else if (!strcmp(argv[1],"/?")) {fprintf(stderr,"Usage: %s [/q]\n",argv[0]);return 0;}
    }

    if (!CreateWellKnownSid(WinBuiltinAdministratorsSid,NULL,pSid,&cbSid)) {
        fprintf(stderr,"CreateWellKnownSid: error %d\n",GetLastError());exit(-1);}

    if (!CheckTokenMembership(NULL,pSid,&isAdmin)) {
        fprintf(stderr,"CheckTokenMembership: error %d\n",GetLastError());exit(-1);}

    if (!quiet) puts(isAdmin ? "Admin" : "Non-admin");
    return !isAdmin;
}

1 MSDN tuyên bố các API là XP + nhưng điều này là sai. CheckTokenMembership là 2k + và một cái khác thậm chí còn cũ hơn . Liên kết cuối cùng cũng chứa một cách phức tạp hơn nhiều sẽ hoạt động ngay cả trong NT.


1

PowerShell có ai không?

param (
    [string]$Role = "Administrators"
)

#check for local role

$identity  = New-Object Security.Principal.WindowsIdentity($env:UserName)
$principal = New-Object Security.Principal.WindowsPrincipal($identity)

Write-Host "IsInRole('$Role'): " $principal.IsInRole($Role)

#enumerate AD roles and lookup

$groups = $identity::GetCurrent().Groups
foreach ($group in $groups) {
    $trans = $group.Translate([Security.Principal.NTAccount]);
    if ($trans.Value -eq $Role) {
       Write-Host "User is in '$Role' role"
    }
}

1

Đây là một cái khác để thêm vào danh sách ;-)

(cố gắng tạo tệp ở vị trí hệ thống)

CD.>"%SystemRoot%\System32\Drivers\etc\_"
MODE CON COLS=80 LINES=25

IF EXIST "%SystemRoot%\System32\Drivers\etc\_" (

  DEL "%SystemRoot%\System32\Drivers\etc\_"

  ECHO Has Admin privileges

) ELSE (

  ECHO No Admin privileges

)

Việc MODE CONkhởi tạo lại màn hình và loại bỏ bất kỳ văn bản / lỗi nào khi không có quyền ghi vào vị trí hệ thống.


0

Thay thế: Sử dụng một tiện ích bên ngoài được thiết kế cho mục đích này, ví dụ: IsAdmin.exe (phần mềm miễn phí không bị hạn chế).

Mã thoát:

0 - Người dùng hiện tại không phải là thành viên của nhóm Quản trị viên

1 - Thành viên người dùng hiện tại của Quản trị viên và đang chạy cao

2 - Thành viên người dùng hiện tại của Quản trị viên, nhưng không chạy cao


0
@echo off
ver
set ADMDIR=C:\Users\Administrator
dir %ADMDIR% 1>nul 2>&1
echo [%errorlevel%] %ADMDIR%
if "%errorlevel%"=="0" goto main
:: further checks e.g. try to list the contents of admin folders
:: wherever they are stored on older versions of Windows
echo You need administrator privileges to run this script: %0
echo Exiting...
exit /b

:main
echo Executing with Administrator privileges...

0
@echo off
:start
set randname=%random%%random%%random%%random%%random%
md \windows\%randname% 2>nul
if %errorlevel%==0 (echo You're elevated!!!
goto end)
if %errorlevel%==1 (echo You're not elevated :(:(
goto end)
goto start
:end
rd \windows\%randname% 2>nul
pause >nul

Tôi sẽ giải thích từng dòng mã:

@echo off

Người dùng sẽ khó chịu với nhiều hơn 1 dòng mà không có điều này.

:start

Điểm mà chương trình bắt đầu.

set randname=%random%%random%%random%%random%%random%

Đặt tên tệp của thư mục sẽ được tạo.

md \windows\%randname% 2>nul

Tạo thư mục trên <DL>:\Windows(thay thế <DL> bằng ký tự ổ đĩa).

if %errorlevel%==0 (echo You're elevated!!!
goto end)

Nếu biến môi trường ERRORLEVEL bằng 0, thì thông báo thành công echo.
Đi đến cuối cùng (không tiến hành thêm nữa).

if %errorlevel%==1 (echo You're not elevated :(:(
goto end)

Nếu ERRORLEVEL là một, thông báo lỗi echo và đi đến cuối.

goto start

Trong trường hợp tên tệp đã tồn tại, hãy tạo lại thư mục (nếu không goto endlệnh sẽ không cho phép chạy này).

:end

Chỉ định điểm kết thúc

rd \windows\%randname% 2>nul

Xóa thư mục đã tạo.

pause >nul

Tạm dừng để người dùng có thể xem tin nhắn.

Lưu ý : Việc >nul2>nulđang lọc đầu ra của các lệnh này.


Có Tôi biết rằng khi bạn đăng nhập với tư cách là người dùng Quản trị viên (không phải người dùng có loại tài khoản quản trị viên), bạn sẽ luôn được nâng cao nhưng đó không phải là lỗi!
EKons

0

net user %username% >nul 2>&1 && echo admin || echo not admin


Điều này có vẻ sai, nó hiển thị nếu người dùng có quyền quản trị viên, nhưng điều này không liên quan đến câu hỏi nếu cmd.exe hiện tại được chạy với quyền quản trị
jeb

Không, nó cho thấy cmd.exe hiện tại có quyền truy cập quản trị vào cơ sở dữ liệu người dùng hay không, vì vậy nó hoạt động ngay cả trong trường hợp khi "phiên net" không. cách khác, "net config> nul 2> & 1 && echo admin | | echo not admin" thực hiện công việc. Cả hai công trình đã được thử nghiệm thành công trên windows xp dưới quyền khách, tài khoản người dùng và tài khoản quản trị với LanmanServer đã dừng (errorlevel 2 cho cmd.exe chạy dưới quyền khách và người dùng điện, errorlevel 0 cho cmd.exe dưới quyền quản trị viên). Nó có hoạt động trong Vista và sau đó với các vấn đề UAC đã nói ở trên không - tôi không biết, vì vậy sẽ rất tuyệt nếu ai đó có thể kiểm tra nó.
dị giáo

2
Tôi đã thử nghiệm với hai cửa sổ cmd (win7x64), bắt đầu có và không có quyền quản trị. Trong cả hai trường hợp nó cho thấyadmin
Jeb

0

Tôi nghĩ cách đơn giản nhất là cố gắng thay đổi ngày hệ thống (yêu cầu quyền quản trị):

date %date%
if errorlevel 1 (
   echo You have NOT admin rights
) else (
   echo You have admin rights
)

Nếu %date%biến có thể bao gồm ngày trong tuần, chỉ cần lấy ngày từ phần cuối của DATElệnh:

for /F "delims=" %%a in ('date ^<NUL') do set "today=%%a" & goto break
:break
for %%a in (%today%) do set "today=%%a"
date %today%
if errorlevel 1 ...

3
Không thể giúp nhưng hạ thấp một "lời khuyên" phá hoại như vậy.
ivan_pozdeev

2
Ngay cả khi gạt sang một bên rằng việc thay đổi thời gian hệ thống mà không có lý do chính đáng là tự bắn vào chân mình (tất cả các loại hiệu ứng kỳ lạ trên phần mềm) - nếu bạn đang sử dụng thời gian hiện tại, bạn vẫn sẽ hiểu sai về thời gian lệnh đang thực thi.
ivan_pozdeev

2
@ivan_pozdeev: Có lẽ bạn chỉ có thể mô tả một trong những "hiệu ứng lạ trên phần mềm" có thể xảy ra khi ngày được thay đổi thành cùng ngày trong phiên cmd.exe ...
Aacini

1
Đồng thời xem superuser.com/questions/27263/
trộm

@ivan_pozdeev: Không ai trong số các liên kết của bạn thậm chí có liên quan từ xa đến phương pháp của tôi. Tôi nghĩ rằng bạn đã hiểu nhầm giải pháp của tôi. Phương pháp này chỉ có thể có một trong hai kết quả có thể xảy ra: không có gì thay đổi (nếu người dùng không có quyền quản trị viên) hoặc NGÀY được thay đổi thành GIÁ TRỊ CÙNG (nếu người dùng có quyền quản trị viên). Phương pháp của tôi KHÔNG THAY ĐỔI THỜI GIAN! Tôi mời bạn đọc lại câu trả lời của tôi và giải thích bằng tiếng Anh đơn giản về lý do khiến bạn thất vọng ...:(
Aacini

0

Tôi tìm thấy một người dùng có thể sử dụng net sessionmặc dù họ không phải là quản trị viên. Tôi đã không nhìn vào lý do tại sao. Cách giải quyết của tôi là kiểm tra xem người dùng có thể tạo một thư mục trong thư mục windows không.

Đây là mã của tôi:

::::::: :testadmin function START :::::::
:: this function tests if current user is admin.  results are returned as "true" or "false" in %isadmin%
:: Test "%isadmin" after calling this function
:: Usage: "call :testadmin"
echo Your script entered the :testadmin function by error.  Usage: "call :testadmin"
pause
exit /b
:testadmin

 rd %windir%\local_admin_test > nul 2> nul
 md %windir%\local_admin_test > nul 2> nul
 if [%errorlevel%]==[0] set isadmin=true
 if not [%errorlevel%]==[0] set isadmin=false
 rd %windir%\local_admin_test > nul 2> nul

 if [%isadmin%]==[true] (
   echo User IS admin.
 )
 if not [%isadmin%]==[true] (
   echo User IS NOT admin.
   timeout 30
   :: or use "pause" instead of "timeout"
   exit /b
 )
exit /b
:::::: :testadmin function END ::::::

0

Một bộ sưu tập của bốn phương pháp dường như tương thích nhất từ ​​trang này. Người đầu tiên thực sự khá thiên tài. Đã thử nghiệm từ XP trở lên. Nhầm lẫn mặc dù không có lệnh tiêu chuẩn có sẵn để kiểm tra quyền quản trị. Tôi đoán bây giờ họ chỉ tập trung vào PowerShell, điều này thực sự vô dụng đối với hầu hết công việc của tôi.

Tôi đã gọi đợt 'exit-if-not-admin.cmd' có thể được gọi từ các đợt khác để đảm bảo họ không tiếp tục thực thi nếu không có quyền quản trị viên yêu cầu.

rem Sun May 03, 2020

rem Methods for XP+ used herein based on:
rem /programming/4051883/batch-script-how-to-check-for-admin-rights
goto method1

:method1
setlocal enabledelayedexpansion
set "dv==::"
if defined !dv! goto notadmin
goto admin

:method2
call fsutil dirty query %SystemDrive% >nul
if %ERRORLEVEL%==0 goto admin
goto notadmin

:method3
net session >nul 2>&1
if %ERRORLEVEL%==0 goto admin
goto notadmin

:method4
fltmc >nul 2>&1 && goto admin
goto notadmin

:admin
echo Administrator rights detected
goto end

:notadmin
echo ERROR: This batch must be run with Administrator privileges
pause
exit /b
goto end

:end```

-1

Đây là giá trị 2 xu của tôi:

Tôi cần một lô để chạy trong môi trường Miền trong quá trình đăng nhập của người dùng, trong môi trường 'phòng làm việc', thấy người dùng tuân thủ chính sách "khóa" và chế độ xem bị hạn chế (chủ yếu được phân phối qua các bộ GPO).

Tập hợp GPO tên miền được áp dụng trước tập lệnh đăng nhập được liên kết với người dùng AD Tạo tập lệnh đăng nhập GPO quá chín muồi vì hồ sơ "mới" của người dùng chưa được tạo / tải / hoặc sẵn sàng để áp dụng "xóa và / hoặc Ghim "thanh tác vụ và các mục Menu bắt đầu vbscript + thêm một số tệp cục bộ.

ví dụ: Môi trường hồ sơ 'người dùng mặc định' được đề xuất yêu cầu lối tắt ".URL '(.lnk) được đặt trong"% ProgramData% \ Microsoft \ Windows \ Start Menu \ Programs * MyNewOWA.url * "và" C: Vị trí \ Users \ Public \ Desktop \ * MyNewOWA.url * ", trong số các mục khác

Người dùng có nhiều máy trong miền, trong đó chỉ các PC 'phòng làm việc' mới yêu cầu các chính sách này.

Các thư mục này yêu cầu quyền 'Quản trị viên' để sửa đổi và mặc dù User Người dùng tên miền 'là một phần của nhóm' Quản trị viên 'cục bộ - UAC là thử thách tiếp theo.

Tìm thấy sự thích nghi khác nhau và hợp nhất ở đây. Tôi cũng có một số người dùng với các thiết bị BYOD cũng yêu cầu các tệp khác có vấn đề về perm. Chưa được thử nghiệm trên XP (một hệ điều hành quá cũ), nhưng mã hiện diện, rất thích phản hồi.

    :: ------------------------------------------------------------------------
    :: You have a royalty-free right to use, modify, reproduce and distribute
    :: the Sample Application Files (and/or any modified version) in any way
    :: you find useful, provided that you agree that the author provides
    :: no warranty, obligations or liability for any Sample Application Files.
    :: ------------------------------------------------------------------------

    :: ********************************************************************************
    ::* Sample batch script to demonstrate the usage of RunAs.cmd
    ::*
    ::* File:           RunAs.cmd
    ::* Date:           12/10/2013
    ::* Version:        1.0.2
    ::*
    ::* Main Function:  Verifies status of 'bespoke' Scripts ability to 'Run As - Admin'
    ::*                 elevated privileges and without UAC prompt
    ::*
    ::* Usage:          Run RunAs.cmd from desired location
    ::*         Bespoke.cmd will be created and called from C:\Utilities location
    ::*         Choose whether to delete the script after its run by removing out-comment
    ::*                 (::) before the 'Del /q Bespoke.cmd' command
    ::*
    ::* Distributed under a "GNU GPL" type basis.
    ::*
    ::* Revisions:
    ::* 1.0.0 - 08/10/2013 - Created.
    ::* 1.0.1 - 09/10/2013 - Include new path creation.
    ::* 1.0.2 - 12/10/2013 - Modify/shorten UAC disable process for Admins
    ::*
    ::* REFERENCES:
    ::* Sample "*.inf" secpol.msc export from Wins 8 x64 @ bottom, 
    ::* Would be default but for 'no password complexities'
    ::*
    ::* To recreate UAC default: 
    ::* Goto:Secpol, edit out Exit, modify .inf set, export as "Wins8x64.inf" 
    ::* and import using secedit cmd provided
    ::*
    :: ********************************************************************************

    @echo off & cls
    color 9F
    Title RUN AS
    Setlocal
    :: Verify local folder availability for script
    IF NOT EXIST C:\Utilities (
        mkdir C:\Utilities & GOTO:GenBatch
    ) ELSE (
        Goto:GenBatch
    )
    :GenBatch
    c:
    cd\
    cd C:\Utilities
    IF NOT EXIST C:\Utilities\Bespoke.cmd (
        GOTO:CreateBatch
    ) ELSE (
        Goto:RunBatch
    )
    :CreateBatch
    Echo. >Bespoke.cmd
    Echo :: ------------------------------------------------------------------------ >>Bespoke.cmd
    Echo :: You have a royalty-free right to use, modify, reproduce and distribute >>Bespoke.cmd
    Echo :: the Sample Application Files (and/or any modified version) in any way >>Bespoke.cmd
    Echo :: you find useful, provided that you agree that the author provides >>Bespoke.cmd
    Echo :: has no warranty, obligations or liability for any Sample Application Files. >>Bespoke.cmd
    Echo :: ------------------------------------------------------------------------ >>Bespoke.cmd
    Echo. >>Bespoke.cmd
    Echo :: ******************************************************************************** >>Bespoke.cmd
    Echo ::* Sample batch script to demonstrate the usage of Bespoke.cmd >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* File:           Bespoke.cmd >>Bespoke.cmd
    Echo ::* Date:           10/10/2013 >>Bespoke.cmd
    Echo ::* Version:        1.0.1 >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Main Function:  Allows for running of Bespoke batch with elevated rights and no future UAC 'pop-up' >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Usage:          Called and created by RunAs.cmd run from desired location >>Bespoke.cmd
    Echo ::*                 Found in the C:\Utilities folder >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Distributed under a "GNU GPL" type basis. >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Revisions: >>Bespoke.cmd
    Echo ::* 1.0.0 - 09/10/2013 - Created. >>Bespoke.cmd
    Echo ::* 1.0.1 - 10/10/2013 - Modified, added ability to temp disable UAC pop-up warning. >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* REFERENCES: >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Exit code (%%^ErrorLevel%%) 0 - No errors have occurred, i.e. immediate previous command ran successfully >>Bespoke.cmd
    Echo ::* Exit code (%%^ErrorLevel%%) 1 - Errors occurred, i.e. immediate previous command ran Unsuccessfully >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* MS OS version check >>Bespoke.cmd
    Echo ::* http://msdn.microsoft.com/en-us/library/windows/desktop/ms724833%28v=vs.85%29.aspx >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Copying to certain folders and running certain apps require elevated perms >>Bespoke.cmd
    Echo ::* Even with 'Run As ...' perms, UAC still pops up. >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* To run a script or application in the Windows Shell >>Bespoke.cmd
    Echo ::* http://ss64.com/vb/shellexecute.html >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Machines joined to a corporate Domain should have the UAC feature set from, and >>Bespoke.cmd
    Echo ::* pushed out from a DC GPO policy >>Bespoke.cmd
    Echo ::* e.g.: 'Computer Configuration - Policies - Windows Settings - Security Settings -  >>Bespoke.cmd
    Echo ::* Local Policies/Security Options - User Account Control -  >>Bespoke.cmd
    Echo ::* Policy: User Account Control: Behavior of the elevation prompt for administrators >>Bespoke.cmd
    Echo ::*         in Admin Approval Mode  Setting: Elevate without prompting >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo :: ******************************************************************************** >>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo @Echo off ^& cls>>Bespoke.cmd
    Echo color 9F>>Bespoke.cmd
    Echo Title RUN AS ADMIN>>Bespoke.cmd
    Echo Setlocal>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo Set "_OSVer=">>Bespoke.cmd
    Echo Set "_OSVer=UAC">>Bespoke.cmd
    Echo VER ^| FINDSTR /IL "5." ^>NUL>>Bespoke.cmd
    Echo IF %%^ErrorLevel%%==0 SET "_OSVer=PreUAC">>Bespoke.cmd
    Echo IF %%^_OSVer%%==PreUAC Goto:XPAdmin>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo :: Check if machine part of a Domain or within a Workgroup environment >>Bespoke.cmd
    Echo Set "_DomainStat=">>Bespoke.cmd
    Echo Set "_DomainStat=%%USERDOMAIN%%">>Bespoke.cmd
    Echo If /i %%^_DomainStat%% EQU %%^computername%% (>>Bespoke.cmd
    Echo Goto:WorkgroupMember>>Bespoke.cmd
    Echo ) ELSE (>>Bespoke.cmd
    Echo Set "_DomainStat=DomMember" ^& Goto:DomainMember>>Bespoke.cmd
    Echo )>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo :WorkgroupMember>>Bespoke.cmd
    Echo :: Verify status of Secpol.msc 'ConsentPromptBehaviorAdmin' Reg key >>Bespoke.cmd
    Echo reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin ^| Find /i "0x0">>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo If %%^ErrorLevel%%==0 (>>Bespoke.cmd
    Echo    Goto:BespokeBuild>>Bespoke.cmd
    Echo ) Else (>>Bespoke.cmd
    Echo    Goto:DisUAC>>Bespoke.cmd
    Echo )>>Bespoke.cmd
    Echo :DisUAC>>Bespoke.cmd
    Echo :XPAdmin>>Bespoke.cmd
    Echo :DomainMember>>Bespoke.cmd
    Echo :: Get ADMIN Privileges, Start batch again, modify UAC ConsentPromptBehaviorAdmin reg if needed >>Bespoke.cmd
    Echo ^>nul ^2^>^&1 ^"^%%^SYSTEMROOT%%\system32\cacls.exe^"^ ^"^%%^SYSTEMROOT%%\system32\config\system^">>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo IF ^'^%%^Errorlevel%%^'^ NEQ '0' (>>Bespoke.cmd
    Echo    echo Set objShell = CreateObject^^("Shell.Application"^^) ^> ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
    Echo    echo objShell.ShellExecute ^"^%%~s0^"^, "", "", "runas", 1 ^>^> ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
    Echo    ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
    Echo    del ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
    Echo    exit /B>>Bespoke.cmd
    Echo ) else (>>Bespoke.cmd
    Echo    pushd ^"^%%^cd%%^">>Bespoke.cmd
    Echo    cd /d ^"^%%~dp0^">>Bespoke.cmd
    Echo    @echo off>>Bespoke.cmd
    Echo )>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo IF %%^_OSVer%%==PreUAC Goto:BespokeBuild>>Bespoke.cmd
    Echo IF %%^_DomainStat%%==DomMember Goto:BespokeBuild>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 0 /f>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo :BespokeBuild>>Bespoke.cmd
    Echo :: Add your script requiring elevated perm and no UAC below: >>Bespoke.cmd
    Echo.>>Bespoke.cmd

    :: PROVIDE BRIEF EXPLINATION AS TO WHAT YOUR SCRIPT WILL ACHIEVE
    Echo ::

    :: ADD THE "PAUSE" BELOW ONLY IF YOU SET TO SEE RESULTS FROM YOUR SCRIPT
    Echo Pause>>Bespoke.cmd

    Echo Goto:EOF>>Bespoke.cmd
    Echo :EOF>>Bespoke.cmd
    Echo Exit>>Bespoke.cmd

    Timeout /T 1 /NOBREAK >Nul
    :RunBatch
    call "Bespoke.cmd"
    :: Del /F /Q "Bespoke.cmd"

    :Secpol
    :: Edit out the 'Exit (rem or ::) to run & import default wins 8 security policy provided below
    Exit

    :: Check if machine part of a Domain or within a Workgroup environment
    Set "_DomainStat="
    Set _DomainStat=%USERDOMAIN%
    If /i %_DomainStat% EQU %computername% (
        Goto:WorkgroupPC
    ) ELSE (
        Echo PC Member of a Domain, Security Policy determined by GPO
        Pause
        Goto:EOF
    )

    :WorkgroupPC

    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin | Find /i "0x5"
    Echo.
    If %ErrorLevel%==0 (
        Echo Machine already set for UAC 'Prompt'
        Pause
        Goto:EOF
    ) else (
        Goto:EnableUAC
    )
    :EnableUAC
    IF NOT EXIST C:\Utilities\Wins8x64Def.inf (
        GOTO:CreateInf
    ) ELSE (
        Goto:RunInf
    )
    :CreateInf
    :: This will create the default '*.inf' file and import it into the 
    :: local security policy for the Wins 8 machine
    Echo [Unicode]>>Wins8x64Def.inf
    Echo Unicode=yes>>Wins8x64Def.inf
    Echo [System Access]>>Wins8x64Def.inf
    Echo MinimumPasswordAge = ^0>>Wins8x64Def.inf
    Echo MaximumPasswordAge = ^-1>>Wins8x64Def.inf
    Echo MinimumPasswordLength = ^0>>Wins8x64Def.inf
    Echo PasswordComplexity = ^0>>Wins8x64Def.inf
    Echo PasswordHistorySize = ^0>>Wins8x64Def.inf
    Echo LockoutBadCount = ^0>>Wins8x64Def.inf
    Echo RequireLogonToChangePassword = ^0>>Wins8x64Def.inf
    Echo ForceLogoffWhenHourExpire = ^0>>Wins8x64Def.inf
    Echo NewAdministratorName = ^"^Administrator^">>Wins8x64Def.inf
    Echo NewGuestName = ^"^Guest^">>Wins8x64Def.inf
    Echo ClearTextPassword = ^0>>Wins8x64Def.inf
    Echo LSAAnonymousNameLookup = ^0>>Wins8x64Def.inf
    Echo EnableAdminAccount = ^0>>Wins8x64Def.inf
    Echo EnableGuestAccount = ^0>>Wins8x64Def.inf
    Echo [Event Audit]>>Wins8x64Def.inf
    Echo AuditSystemEvents = ^0>>Wins8x64Def.inf
    Echo AuditLogonEvents = ^0>>Wins8x64Def.inf
    Echo AuditObjectAccess = ^0>>Wins8x64Def.inf
    Echo AuditPrivilegeUse = ^0>>Wins8x64Def.inf
    Echo AuditPolicyChange = ^0>>Wins8x64Def.inf
    Echo AuditAccountManage = ^0>>Wins8x64Def.inf
    Echo AuditProcessTracking = ^0>>Wins8x64Def.inf
    Echo AuditDSAccess = ^0>>Wins8x64Def.inf
    Echo AuditAccountLogon = ^0>>Wins8x64Def.inf
    Echo [Registry Values]>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Setup\RecoveryConsole\SecurityLevel=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Setup\RecoveryConsole\SetCommand=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\CachedLogonsCount=1,"10">>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ForceUnlockLogon=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\PasswordExpiryWarning=4,5>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ScRemoveOption=1,"0">>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin=4,5>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorUser=4,3>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableCAD=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DontDisplayLastUserName=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableInstallerDetection=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableSecureUIAPaths=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableUIADesktopToggle=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableVirtualization=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\FilterAdministratorToken=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeCaption=1,"">>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeText=7,>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\PromptOnSecureDesktop=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ScForceOption=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ShutdownWithoutLogon=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\UndockWithoutLogon=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ValidateAdminCodeSignatures=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Policies\Microsoft\Windows\Safer\CodeIdentifiers\AuthenticodeEnabled=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\AuditBaseObjects=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\CrashOnAuditFail=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\DisableDomainCreds=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\EveryoneIncludesAnonymous=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy\Enabled=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\FullPrivilegeAuditing=3,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\LimitBlankPasswordUse=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\MSV1_0\NTLMMinClientSec=4,536870912>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\MSV1_0\NTLMMinServerSec=4,536870912>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\NoLMHash=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymous=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymousSAM=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Print\Providers\LanMan Print Services\Servers\AddPrinterDrivers=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\SecurePipeServers\Winreg\AllowedExactPaths\Machine=7,System\CurrentControlSet\Control\ProductOptions,System\CurrentControlSet\Control\Server Applications,Software\Microsoft\Windows NT\CurrentVersion>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\SecurePipeServers\Winreg\AllowedPaths\Machine=7,System\CurrentControlSet\Control\Print\Printers,System\CurrentControlSet\Services\Eventlog,Software\Microsoft\OLAP Server,Software\Microsoft\Windows NT\CurrentVersion\Print,Software\Microsoft\Windows NT\CurrentVersion\Windows,System\CurrentControlSet\Control\ContentIndex,System\CurrentControlSet\Control\Terminal Server,System\CurrentControlSet\Control\Terminal Server\UserConfig,System\CurrentControlSet\Control\Terminal Server\DefaultUserConfiguration,Software\Microsoft\Windows NT\CurrentVersion\Perflib,System\CurrentControlSet\Services\SysmonLog>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Session Manager\Kernel\ObCaseInsensitive=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\ClearPageFileAtShutdown=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Session Manager\ProtectionMode=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\optional=7,Posix>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\AutoDisconnect=4,15>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\EnableForcedLogOff=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\EnableSecuritySignature=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\NullSessionPipes=7,>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\RequireSecuritySignature=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\RestrictNullSessAccess=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\EnablePlainTextPassword=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\EnableSecuritySignature=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\RequireSecuritySignature=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LDAP\LDAPClientIntegrity=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\MaximumPasswordAge=4,30>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\RequireSignOrSeal=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\RequireStrongKey=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\SealSecureChannel=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\SignSecureChannel=4,1>>Wins8x64Def.inf
    Echo [Privilege Rights]>>Wins8x64Def.inf
    Echo SeNetworkLogonRight = *S-1-1-0,*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeBackupPrivilege = *S-1-5-32-544,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeChangeNotifyPrivilege = *S-1-1-0,*S-1-5-19,*S-1-5-20,*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551,*S-1-5-90-^0>>Wins8x64Def.inf
    Echo SeSystemtimePrivilege = *S-1-5-19,*S-1-5-32-544>>Wins8x64Def.inf
    Echo SeCreatePagefilePrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeDebugPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeRemoteShutdownPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeAuditPrivilege = *S-1-5-19,*S-1-5-20>>Wins8x64Def.inf
    Echo SeIncreaseQuotaPrivilege = *S-1-5-19,*S-1-5-20,*S-1-5-32-544>>Wins8x64Def.inf
    Echo SeIncreaseBasePriorityPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeLoadDriverPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeBatchLogonRight = *S-1-5-32-544,*S-1-5-32-551,*S-1-5-32-559>>Wins8x64Def.inf
    Echo SeServiceLogonRight = *S-1-5-80-0,*S-1-5-83-^0>>Wins8x64Def.inf
    Echo SeInteractiveLogonRight = Guest,*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeSecurityPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeSystemEnvironmentPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeProfileSingleProcessPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeSystemProfilePrivilege = *S-1-5-32-544,*S-1-5-80-3139157870-2983391045-3678747466-658725712-1809340420>>Wins8x64Def.inf
    Echo SeAssignPrimaryTokenPrivilege = *S-1-5-19,*S-1-5-20>>Wins8x64Def.inf
    Echo SeRestorePrivilege = *S-1-5-32-544,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeShutdownPrivilege = *S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeTakeOwnershipPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeDenyNetworkLogonRight = Guest>>Wins8x64Def.inf
    Echo SeDenyInteractiveLogonRight = Guest>>Wins8x64Def.inf
    Echo SeUndockPrivilege = *S-1-5-32-544,*S-1-5-32-545>>Wins8x64Def.inf
    Echo SeManageVolumePrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeRemoteInteractiveLogonRight = *S-1-5-32-544,*S-1-5-32-555>>Wins8x64Def.inf
    Echo SeImpersonatePrivilege = *S-1-5-19,*S-1-5-20,*S-1-5-32-544,*S-1-5-6>>Wins8x64Def.inf
    Echo SeCreateGlobalPrivilege = *S-1-5-19,*S-1-5-20,*S-1-5-32-544,*S-1-5-6>>Wins8x64Def.inf
    Echo SeIncreaseWorkingSetPrivilege = *S-1-5-32-545,*S-1-5-90-^0>>Wins8x64Def.inf
    Echo SeTimeZonePrivilege = *S-1-5-19,*S-1-5-32-544,*S-1-5-32-545>>Wins8x64Def.inf
    Echo SeCreateSymbolicLinkPrivilege = *S-1-5-32-544,*S-1-5-83-^0>>Wins8x64Def.inf
    Echo [Version]>>Wins8x64Def.inf
    Echo signature="$CHICAGO$">>Wins8x64Def.inf
    Echo Revision=1>>Wins8x64Def.inf

    :RunInf
    :: Import 'Wins8x64Def.inf' with ADMIN Privileges, to modify UAC ConsentPromptBehaviorAdmin reg
    >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%%\system32\config\system"
    IF '%Errorlevel%' NEQ '0' (
        echo Set objShell = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
        echo objShell.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
       "%temp%%\getadmin.vbs"
        del "%temp%\getadmin.vbs"
        exit /B
        Secedit /configure /db secedit.sdb /cfg C:\Utilities\Wins8x64Def.inf /overwrite
        Goto:CheckUAC
    ) else (
        Secedit /configure /db secedit.sdb /cfg C:\Utilities\Wins8x64Def.inf /overwrite
        @echo off
    )
    :CheckUAC
    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin | Find /i "0x5"
    Echo.
    If %ErrorLevel%==0 (
        Echo ConsentPromptBehaviorAdmin set to 'Prompt'
        Pause
        Del /Q C:\Utilities\Wins8x64Def.inf
        Goto:EOF
    ) else (
        Echo ConsentPromptBehaviorAdmin NOT set to default
        Pause
    )
    ENDLOCAL
    :EOF
    Exit

Các PC miền nên được quản lý càng nhiều càng tốt bởi các bộ GPO. Nhóm làm việc / Máy độc lập có thể được điều chỉnh bởi tập lệnh này.

Hãy nhớ rằng, một dấu nhắc UAC sẽ bật lên ít nhất một lần với PC nhóm làm việc BYOD (ngay khi yêu cầu nâng cấp đầu tiên thành 'perm perms'), nhưng vì chính sách bảo mật cục bộ được sửa đổi cho quản trị viên sử dụng từ thời điểm này, cửa sổ bật lên sẽ biến mất.

Máy tính miền phải có chính sách GPO "ConsentPromptBehaviorAdmin" được đặt trong chính sách "Khóa" đã được tạo của bạn - như được giải thích trong phần 'TÀI LIỆU THAM KHẢO'.

Một lần nữa, hãy chạy quá trình nhập secedit.exe của tệp '.inf' mặc định nếu bạn bị kẹt trong toàn bộ cuộc tranh luận "Tới UAC hoặc Không sang UAC" :-).

btw: @boileau Hãy kiểm tra thất bại của bạn trên:

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

Bằng cách chỉ chạy "% HỆ THỐNG HỆ THỐNG% \ system32 \ cacls.exe" hoặc "% HỆ THỐNG HỆ THỐNG% \ system32 \ config \ system" hoặc cả hai từ dấu nhắc lệnh - nâng cao hay không, kiểm tra kết quả trên bảng.


-2

Một cách khác để làm điều này.

REM    # # # #      CHECKING OR IS STARTED AS ADMINISTRATOR     # # # # #

FSUTIL | findstr /I "volume" > nul&if not errorlevel 1  goto Administrator_OK

cls
echo *******************************************************
echo ***    R U N    A S    A D M I N I S T R A T O R    ***
echo *******************************************************
echo.
echo.
echo Call up just as the Administrator. Abbreviation can be done to the script and set:
echo.
echo      Shortcut ^> Advanced ^> Run as Administrator
echo.
echo.
echo Alternatively, a single run "Run as Administrator"
echo or in the Schedule tasks with highest privileges
pause > nul
goto:eof
:Administrator_OK

REM Some next lines code ...

Liên kết đó được cho là gì? Bị gắn cờ là thư rác vì liên kết.
mmgross

Kiểm tra câu trả lời này để biết mã tự động kiểm tra và nhắc nhở: stackoverflow.com/a/30590134/4932683
cyberponk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.