বাহ্যিক সরঞ্জাম ব্যবহার না করেই একটি সহজ উপায় আছে - এটি উইন্ডোজ 7, 8, 8.1 এবং 10 এর সাথে দারুণভাবে চলে এবং পিছনের দিক থেকে সামঞ্জস্যপূর্ণ (উইন্ডোজ এক্সপির কোনও ইউএসি নেই, সুতরাং উচ্চতার প্রয়োজন হয় না - এতে স্ক্রিপ্ট সবেমাত্র এগিয়ে যায়)।
এই কোডটি দেখুন (আমি উইন্ডোজে 7 তে "অ্যাক্সেস অস্বীকৃত" থ্রেড ব্যাচ ফাইলে পোস্ট করা নিরনওল্ফ দ্বারা কোডটি দ্বারা অনুপ্রাণিত হয়েছি , তবে আমি এটি উন্নত করেছি - আমার সংস্করণে কোনও ডিরেক্টরি তৈরি এবং সরানো হয়নি) প্রশাসকের সুবিধার্থে পরীক্ষা করুন):
::::::::::::::::::::::::::::::::::::::::::::
:: Elevate.cmd - Version 4
:: Automatically check & get admin rights
:: see "https://stackoverflow.com/a/12264592/1016343" for description
::::::::::::::::::::::::::::::::::::::::::::
@echo off
CLS
ECHO.
ECHO =============================
ECHO Running Admin shell
ECHO =============================
:init
setlocal DisableDelayedExpansion
set cmdInvoke=1
set winSysFolder=System32
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO.
ECHO **************************************
ECHO Invoking UAC for Privilege Escalation
ECHO **************************************
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " " >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
if '%cmdInvoke%'=='1' goto InvokeCmd
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
goto ExecElevation
:InvokeCmd
ECHO args = "/c """ + "!batchPath!" + """ " + args >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%"
:ExecElevation
"%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul & shift /1)
::::::::::::::::::::::::::::
::START
::::::::::::::::::::::::::::
REM Run shell as admin (example) - put here code as you like
ECHO %batchName% Arguments: P1=%1 P2=%2 P3=%3 P4=%4 P5=%5 P6=%6 P7=%7 P8=%8 P9=%9
cmd /k
স্ক্রিপ্টটি NET FILE
প্রশাসকের সুযোগ- সুবিধার প্রয়োজনের সুযোগটি নেয় এবং errorlevel 1
যদি তা না থাকে তবে ফিরে আসে । উন্নতি স্ক্রিপ্ট তৈরি করে অর্জিত হয় যা সুযোগগুলি পাওয়ার জন্য ব্যাচ ফাইলটি পুনরায় চালু করে। এর ফলে উইন্ডোজ ইউএসি ডায়ালগ উপস্থাপন করে এবং আপনাকে প্রশাসকের অ্যাকাউন্ট এবং পাসওয়ার্ড জিজ্ঞাসা করে।
আমি এটি উইন্ডোজ 7, 8, 8.1, 10 এবং উইন্ডোজ এক্সপি দিয়ে পরীক্ষা করেছি - এটি সবার পক্ষে ঠিক কাজ করে। সুবিধাটি হ'ল, স্টার্ট পয়েন্টের পরে আপনি সিস্টেম অ্যাডমিনিস্ট্রেটরের বিশেষাধিকারের জন্য যে কোনও কিছু রাখতে পারেন, উদাহরণস্বরূপ, আপনি যদি ডিবাগিং উদ্দেশ্যে উইন্ডোজ পরিষেবাটি পুনরায় ইনস্টল এবং পুনরায় চালনা করতে চান তবে (ধরে নেওয়া হবে যে মাইপ্যাকেজ.এমসি একটি সার্ভিস ইনস্টলার প্যাকেজ) :
msiexec /passive /x mypackage.msi
msiexec /passive /i mypackage.msi
net start myservice
এই সুবিধাপ্রাপ্ত উচ্চ স্ক্রিপ্ট ব্যতীত, ইউএসি আপনাকে আপনার প্রশাসক ব্যবহারকারী এবং পাসওয়ার্ডের জন্য তিনবার জিজ্ঞাসা করবে - এখন আপনাকে প্রথম দিকে একবারেই জিজ্ঞাসা করা হয়েছিল, এবং কেবল প্রয়োজন হলেই।
যদি আপনার স্ক্রিপ্টটিতে কেবল একটি ত্রুটি বার্তা প্রদর্শন করা প্রয়োজন এবং যদি স্বয়ংক্রিয়ভাবে উত্তোলনের পরিবর্তে প্রশাসকের কোনও সুবিধা না থাকে তবে এটি আরও সহজ: আপনি আপনার স্ক্রিপ্টের শুরুতে নিম্নলিখিতগুলি যুক্ত করে এটি অর্জন করতে পারেন:
@ECHO OFF & CLS & ECHO.
NET FILE 1>NUL 2>NUL & IF ERRORLEVEL 1 (ECHO You must right-click and select &
ECHO "RUN AS ADMINISTRATOR" to run this batch. Exiting... & ECHO. &
PAUSE & EXIT /D)
REM ... proceed here with admin rights ...
এইভাবে, ব্যবহারকারীকে রাইট-ক্লিক করতে হবে এবং "প্রশাসক হিসাবে চালান" নির্বাচন করতে হবে । স্ক্রিপ্টটি REM
প্রশাসকের অধিকারগুলি সনাক্ত করে যদি বিবৃতি দেওয়ার পরে এগিয়ে যায় তবে অন্যথায় কোনও ত্রুটি সহ প্রস্থান করুন। আপনার যদি প্রয়োজন হয় না PAUSE
, কেবল এটি সরিয়ে দিন।
গুরুত্বপূর্ণ: NET FILE [...] EXIT /D)
অবশ্যই একই লাইনে থাকতে হবে। এটি আরও ভাল পাঠযোগ্যতার জন্য এখানে একাধিক লাইনে প্রদর্শিত হচ্ছে!
কিছু মেশিনে, আমি সমস্যার মুখোমুখি হয়েছি, যা উপরের নতুন সংস্করণে ইতিমধ্যে সমাধান হয়েছে। একটি হ'ল বিভিন্ন ডাবল উদ্ধৃতি হ্যান্ডলিংয়ের কারণে, এবং অন্য সমস্যাটি উইন্ডোজ 7 মেশিনে ইউএসি অক্ষম করা (সর্বনিম্ন স্তরে সেট করা হয়েছিল) এর কারণে হয়েছিল, সুতরাং স্ক্রিপ্টটি নিজেকে বারবার কল করে।
আমি এখনই উদ্ধৃতিটি পথে ফেলে দিয়ে এবং এগুলি পুনরায় যুক্ত করে ঠিক করেছি এবং আমি একটি অতিরিক্ত পরামিতি যুক্ত করেছি যা স্ক্রিপ্টটি যখন উন্নত অধিকারগুলির সাথে পুনরায় চালু হয় তখন যুক্ত করা হয়।
ডাবল উদ্ধৃতিগুলি নিম্নলিখিত দ্বারা সরানো হয়েছে (বিশদটি এখানে ):
setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion
তারপরে আপনি ব্যবহার করে পাথ অ্যাক্সেস করতে পারেন !batchPath!
। এটিতে কোনও দ্বিগুণ উদ্ধৃতি নেই, তাই "!batchPath!"
স্ক্রিপ্টে পরে বলা নিরাপদ ।
লাইন
if '%1'=='ELEV' (shift & goto gotPrivileges)
অধিকারগুলি উন্নত করার জন্য ভিবিএস স্ক্রিপ্ট দ্বারা স্ক্রিপ্টটিকে ইতিমধ্যে ডেকে আনা হয়েছে কি না তা পরীক্ষা করে না , অতএব অন্তহীন পুনরাবৃত্তিগুলি এড়িয়ে চলে। এটি ব্যবহার করে প্যারামিটারটি সরিয়ে দেয় shift
।
হালনাগাদ:
রেজিস্টার থাকার এড়াতে .vbs
ইন এক্সটেনশান উইন্ডোজ 10 , আমি লাইন প্রতিস্থাপন আছে
"%temp%\OEgetPrivileges.vbs"
দ্বারা
"%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
উপরে লিপিতে; cd /d %~dp0
স্টিফেনের পরামর্শ অনুসারে (পৃথক উত্তর) এবং স্ক্রিপ্ট ডিরেক্টরিটি ডিফল্ট হিসাবে সেট করতে টম জাটো (মন্তব্য) দ্বারা পরামর্শ অনুসারে যুক্ত করা হয়েছে।
এখন স্ক্রিপ্টটি সম্মান কমান্ড লাইন প্যারামিটার এটি দেওয়া হচ্ছে। জ্যাক্সমলেট, ট্যানিসডিএলজে এবং পিটার মর্টেনসেনকে পর্যবেক্ষণ এবং অনুপ্রেরণার জন্য ধন্যবাদ।
Artjom বি এর ইঙ্গিতটি মতে, আমি এটা বিশ্লেষণ এবং প্রতিস্থাপিত আছে SHIFT
দ্বারা SHIFT /1
, যার জন্য ফাইলের নাম অপরিবর্তিত, %0
পরামিতি
যোগ করা হয়েছে del "%temp%\OEgetPrivileges_%batchName%.vbs"
থেকে :gotPrivileges
অধ্যায় পরিষ্কার করতে (যেমন MLT প্রস্তাব)। %batchName%
আপনি যদি সমান্তরালে বিভিন্ন ব্যাচ চালান তবে প্রভাব এড়ানোর জন্য যুক্ত করা হয়েছে। নোট করুন যে আপনাকে for
উন্নত স্ট্রিং ফাংশনগুলির সুবিধা নিতে সক্ষম হতে ব্যবহার করতে হবে, যেমন %%~nk
কেবল ফাইলের নাম বের করে।
অপ্টিমাইজড স্ক্রিপ্ট কাঠামো, উন্নতি (অ্যাড ভেরিয়েবল vbsGetPrivileges
যা এখন সর্বত্র রেফারেন্স হিসাবে ফাইলের নাম বা নাম সহজেই পরিবর্তন করতে দেয়, কেবল .vbs
যদি ব্যাচকে উন্নত করার প্রয়োজন হয় তবে ফাইল মুছুন )
কিছু ক্ষেত্রে, উন্নয়নের জন্য একটি পৃথক কলিং বাক্য গঠন প্রয়োজন। স্ক্রিপ্টটি যদি কাজ না করে তবে নীচের প্যারামিটারগুলি পরীক্ষা করুন:
set cmdInvoke=0
set winSysFolder=System32
হয় 1 ম পরামিতিটি পরিবর্তন করুন set cmdInvoke=1
এবং এটি ইতিমধ্যে সমস্যার সমাধান করেছে কিনা তা পরীক্ষা করুন। এটি cmd.exe
স্ক্রিপ্টটিতে উন্নতি সম্পাদন করবে।
অথবা 2 য় প্যারামিটারে পরিবর্তন করার চেষ্টা করুন winSysFolder=Sysnative
, এটি 64 বিট সিস্টেমে সহায়তা করতে পারে (তবে বেশিরভাগ ক্ষেত্রে প্রয়োজন হয় না)। (এডিবাইলি এটি জানিয়েছে) "সিসনেটিভ" কেবলমাত্র 32-বিট স্ক্রিপ্ট হোস্টের (যেমন একটি ভিজ্যুয়াল স্টুডিও বিল্ড প্রক্রিয়া, বা অন্য 32-বিট অ্যাপ্লিকেশন থেকে স্ক্রিপ্ট আহবান) )৪-বিট অ্যাপ্লিকেশন চালু করার জন্য প্রয়োজনীয়।
প্যারামিটারগুলি কীভাবে ব্যাখ্যা করা হয় তা আরও স্পষ্ট করতে, আমি এখন এটির মতো প্রদর্শন করছি P1=value1 P2=value2 ... P9=value9
। এটি বিশেষত কার্যকর যদি আপনার ডাবল উদ্ধৃতিতে যেমন পাথরের মতো পরামিতিগুলি আবদ্ধ করতে হয় তবে "C:\Program Files"
।
আপনি যদি ভিবিএস স্ক্রিপ্টটি ডিবাগ করতে চান তবে আপনি এটি যুক্ত করতে পারেন //X
আপনি WScript.exe প্যারামিটারটিকে প্রথম প্যারামিটার হিসাবে , এখানে প্রস্তাবিত (এটি CScript.exe এর জন্য বর্ণিত, তবে WScript.exe এর জন্যও কাজ করে)।
উপকারী সংজুক: