শুরু করার সময় অনেক প্রোগ্রাম পারমিশন এলিভেশন চায় (অ্যাপ আইকনে শিল্ড), কিন্তু আসলে তাদের নরমাল অপারেশনের জন্য অ্যাডমিনিস্ট্রেটর প্রিভিলেজ দরকার নেই। উদাহরণস্বরূপ, আপনি ম্যানুয়ালি আপনার ইউজারদের অ্যাপ ফোল্ডারের ওপর ProgramFiles-এ এবং/অথবা প্রোগ্রাম দ্বারা ব্যবহৃত রেজিস্ট্রি কিগুলোর ওপর পারমিশন দিতে পারেন। তখন নন-অ্যাডমিন ইউজার একাউন্টের অধীনে এমন প্রোগ্রাম চালালে UAC প্রম্পট আসবে এবং User Account Control ইনএবল থাকলে অ্যাডমিনিস্ট্রেটর পাসওয়ার্ড দিতে বলবে। এই মেকানিজম বাইপাস করার জন্য অনেক ইউজার সহজে UAC ডিজেবল করে বা ইউজার একাউন্টকে লোকাল "Administrators" গ্রুপে যোগ করে অ্যাডমিন প্রিভিলেজ দেয়। নিশ্চিতভাবেই, দুটো পদ্ধতিই নিরাপদ নয়।
কেন কিছু উইন্ডোজ অ্যাপ স্ট্যান্ডার্ড ইউজারের অধীনে চলে না এবং অ্যাডমিনিস্ট্রেটর পারমিশন চায়?
একটি অ্যাপ তার নিজস্ব ফোল্ডারে C:\Program Files (x86)\SomeApp-এ কিছু ফাইল (লগস, কনফিগস, ইত্যাদি) মডিফাই করার জন্য অ্যাডমিন প্রিভিলেজ চাইতে পারে। ডিফল্টলি, ইউজারদের এই ডিরেক্টরিতে এডিট (রাইট এবং মডিফাই) পারমিশন নেই। এই প্রোগ্রাম নরমালি কাজ করার জন্য অ্যাডমিনিস্ট্রেটর পারমিশন দরকার। এই সমস্যা সমাধান করতে, আপনাকে NTFS ফাইল সিস্টেম লেভেলে ইউজার (বা বিল্ট-ইন Users গ্রুপ) জন্য অ্যাপ ফোল্ডারে modify এবং/অথবা write পারমিশন ম্যানুয়ালি দিতে হবে।
নোট। আসলে, C:\Program Files-এ আপনার নিজস্ব ফোল্ডারের অধীনে পরিবর্তনশীল অ্যাপ্লিকেশন ডেটা সংরক্ষণ করা রিকমেন্ড করা হয় না। অ্যাপ ডেটা ইউজার প্রোফাইলে সংরক্ষণ করা ভালো। কিন্তু এটি অ্যাপ ডেভেলপারদের আলস্য এবং অক্ষমতার প্রশ্ন।স্ট্যান্ডার্ড ইউজারের অধীনে অ্যাডমিন প্রিভিলেজ চাওয়া প্রোগ্রাম কীভাবে চালাবেন?
আগে আমরা বর্ণনা করেছি কীভাবে RunAsInvoker প্যারামিটার ব্যবহার করে নির্দিষ্ট অ্যাপের জন্য UAC প্রম্পট ডিজেবল করা যায়। তবে এই মেথড পর্যাপ্ত ফ্লেক্সিবল নয়।
আপনি উইন্ডোজ ক্রেডেনশিয়াল ম্যানেজারে সংরক্ষিত অ্যাডমিনিস্ট্রেটর পাসওয়ার্ড সহ RunAs ব্যবহার করতে পারেন /SAVECRED অপশন দিয়ে। এটি ও অনিরাপদ কারণ ইউজার সংরক্ষিত অ্যাডমিন ক্রেডেনশিয়াল পাসওয়ার্ড ব্যবহার করে এই কম্পিউটারে যেকোনো প্রোগ্রাম চালাতে পারবে।
চলুন একটি সহজ উপায় বিবেচনা করি যেকোনো প্রোগ্রামকে অ্যাডমিনিস্ট্রেটর প্রিভিলেজ ছাড়া (অ্যাডমিন পাসওয়ার্ড ছাড়া) এবং UAC ইনএবল থাকা অবস্থায় (UAC স্লাইডার লেভেল ৪, ৩ বা ২) চালাতে বাধ্য করতে।
উদাহরণ হিসেবে Registry Editor নিই — regedit.exe (এটি C:\Windows\ ফোল্ডারে অবস্থিত)। অ্যাপ আইকনের পাশে UAC শিল্ড লক্ষ্য করুন। এই আইকন মানে এই প্রোগ্রাম চালাতে UAC-এর মাধ্যমে প্রিভিলেজ এলিভেশন চায়া হবে।
যদি regedit.exe চালান, তবে User Account Control উইন্ডো আসবে অ্যাডমিনিস্ট্রেটর ক্রেডেনশিয়াল চাইবে (Do you want to allow this app to make changes to your device?)। আপনি পাসওয়ার্ড না দিয়ে এবং এলিভেশন কনফার্ম না করলে অ্যাপ চালু হবena।
চলুন এই প্রোগ্রামের জন্য UAC রিকোয়েস্ট বাইপাস করার চেষ্টা করি। আপনার ডেস্কটاپে run-as-non-admin.bat নামে একটি টেক্সট ফাইল তৈরি করুন নিচের কোডসহ:
cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %1"
আপনি যে EXE ফাইলটি চালাতে চান সেটিকে ডেস্কটপের এই BAT ফাইলের ওপর ড্র্যাগ করুন যাতে regedit.exe অ্যাডমিনিস্ট্রেটর প্রিভিলেজ ছাড়া এবং UAC প্রম্পট দমন করে চালু হয়।
Task Manager খুলে Elevated কলাম যোগ করলে দেখবেন regedit.exe প্রসেস এলিভেটেড স্ট্যাটাস ছাড়া (নন-অ্যাডমিন ইউজার পারমিশনে) চলছে।
HKEY_LOCAL_MACHINE রেজিস্ট্রি হাইভের যেকোনো প্যারামিটার এডিট করার চেষ্টা করুন। দেখা যাবে, ইউজার এই রেজিস্ট্রি কিতে আইটেম এডিট করতে পারছে না (ইউজারের সিস্টেম রেজিস্ট্রি কিগুলোর ওপর রাইট পারমিশন নেই)। কিন্তু আপনি আপনার ইউজার হাইভ — HKEY_CURRENT_USER-এ রেজিস্ট্রি কি এবং প্যারামিটার যোগ বা এডিট করতে পারবেন।
একইভাবে আপনি যেকোনো অ্যাপ BAT ফাইল ব্যবহার করে চালাতে পারেন। শুধু এক্সিকিউটেবল ফাইলের পাথ স্পেসিফাই করুন।
run-app-as-non-admin.bat
Set ApplicationPath="C:\Program Files\SomeApp\testapp.exe"
cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %ApplicationPath%"
আপনি একটি কনটেক্সট মেনুও যোগ করতে পারেন যা সব অ্যাপকে এলিভেশন ছাড়া চালানোর অনুমতি দেবে। এর জন্য RunAsUser.REG ফাইল তৈরি করুন, নিচের কোড কপি করুন, সেভ করুন এবং রেজ ফাইলে ডাবল ক্লিক করে উইন্ডোজ রেজিস্ট্রিতে ইমপোর্ট করুন (এই পরিবর্তন প্রয়োগ করতে অ্যাডমিনিস্ট্রেটর পারমিশন দরকার)।
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker] @="Run as user without UAC privilege elevation" [HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command] @="cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""
এরপর, যেকোনো অ্যাপ্লিকেশন অ্যাডমিনিস্ট্রেটর প্রিভিলেজ ছাড়া চালাতে File Explorer-এ কনটেক্সট মেনু থেকে "Run as user without UAC privilege elevation" সিলেক্ট করুন।
GPO ব্যবহার করে রেজিস্ট্রি প্যারামিটার ইমপোর্ট করে এই অপশনটি সব ডোমেইন কম্পিউটারে ডিপ্লয় করা যায়।
আপনাকে একবার আবার মনে করিয়ে দিই যে প্রোগ্রাম RUNASINVOKER মোডে ব্যবহার করলে অ্যাপকে এলিভেট করতে পারবেন না। RunAsInvoker UAC প্রম্পট দমন করে এবং প্রোগ্রামকে বলে যে এটি বর্তমান ইউজারের পারমিশনে চালু হবে, প্রিভিলেজ এলিভেশনের জন্য অনুরোধ করবে না। যদি কোনো প্রোগ্রাম সিস্টেম সেটিংস বা ফাইল এডিট করার জন্য உணবশ্যই এলিভেটেড প্রিভিলেজ দরকার, তবে এটি কাজ করবena বা আবার অ্যাডমিন পারমিশন চাইবে।
__COMPAT_LAYER-এ RunAsInvoker দিয়ে UAC বাইপাস করা
এনভায়রনমেন্ট ভেরিয়েবল __COMPAT_LAYER আপনাকে অ্যাপ্লিকেশনগুলোর জন্য ভিন্ন কম্প্যাটিবিলিটি লেভেল সেট করতে দেয় (EXE ফাইলের প্রপার্টিজের Compatibility ট্যাব)। এই ভেরিয়েবল ব্যবহার করে আপনি কোন কম্প্যাটিবিলিটি সেটিংস প্রোগ্রাম চালানোর সময় ব্যবহার হবে তা স্পেসিফাই করতে পারেন। উদাহরণস্বরূপ, উইন্ডোজ ৮ কম্প্যাটিবিলিটি মোড এবং 640×480 রেজোলিউশনে অ্যাপ চালু করতে:
set __COMPAT_LAYER=Win8RTM 640x480
__COMPAT_LAYER ভেরিয়েবলের কিছু অপশন আছে যা আমাদের জন্য আকর্ষণীয়। নিচের প্যারামিটারগুলো রয়েছে:
- RunAsInvoker – প্যারেন্ট প্রসেসের প্রিভিলেজে অ্যাপ চালানোর সাথে UAC প্রম্পট ছাড়া;
- RunAsHighest – ইউজারের উপলব্ধ সর্বোচ্চ পারমিশনে প্রোগ্রাম চালানো (UAC প্রম্পট আসবে যদি ইউজারের অ্যাডমিন প্রিভিলেজ থাকে);
- RunAsAdmin – অ্যাপ অ্যাডমিনিস্ট্রেটর হিসেবে চালানো (প্রতিবার UAC প্রম্পট আসবে)।
অর্থাৎ RunAsInvoker প্যারামিটার অ্যাডমিনিস্ট্রেটর পারমিশন দেয় না, শুধু UAC প্রম্পট দমন করে।
নিচের CMD কোড বর্তমান প্রসেসের জন্য RunAsInvoker মোড ইনএবল করে এবং নির্দিষ্ট প্রোগ্রাম এলিভেশন ছাড়া চালু করে:
set __COMPAT_LAYER=RUNASINVOKER
start "" "C:\Program Files\MyApp\testapp.exe"
EXE ফাইল ম্যানিফেস্টে RunAsInvoker মোড ইনএবল করা
যেমন আগে বললাম, উইন্ডোজ ১০ UAC শিল্ড আইকন দেখায় যেসব প্রোগ্রাম চালানোর জন্য এলিভেশন দরকার। ডেভেলপাররা প্রোগ্রাম manifest-এ কম্পাইল করার সময় এই রিকোয়েস্ট সেট করে।
আপনি যেকোনো exe ফাইলের ম্যানিফেস্ট এডিট করে প্রোগ্রাম এলিভেটেড মোডে চালানোর রিকোয়েস্ট ডিজেবল করতে পারেন।
প্রোগ্রাম ম্যানিফেস্ট এডিট করতে ফ্রি Resource Hacker টুল ব্যবহার করতে পারেন। Resource Hacker-এ এক্সিকিউটেবল ফাইল খুলুন।
এই উদাহরণে, আমি Sysinternals-এর Autologon.exe টুলের ম্যানিফেস্ট এডিট করব, যা পাসওয়ার্ড ছাড়া উইন্ডোজে অটোমেটিক লগইন করার জন্য ব্যবহার করা হয়।
বাম পাশের ট্রিতে Manifest সেকশনে যান এবং প্রোগ্রাম ম্যানিফেস্ট খুলুন। নিচের XML সেকশনে লক্ষ্য করুন:
<requestedPrivileges> <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> </requestedPrivileges>
requireAdministrator অপশনের কারণেই উইন্ডোজ সবসময় এই প্রোগ্রামকে অ্যাডমিনিস্ট্রেটর হিসেবে চালানোর চেষ্টা করে।
requireAdministrator কে asInvoker-এ পরিবর্তন করুন এবং exe ফাইলে পরিবর্তনগুলো সেভ করুন।
লক্ষ্য করুন এখন প্রোগ্রাম আইকন থেকে UAC শিল্ড গিয়ে গেছে, এবং আপনি এটি বর্তমান ইউজার পারমিশনে অ্যাডমিন পাসওয়ার্ড চাইবেনা চালাতে পারবেন।
যদি এক্সিকিউটেবল অ্যাপ ফাইল MS Authenticode (Code Signing সার্টিফিকেট) দিয়ে সাইন করা থাকে, তবে exe ফাইল মডিফাই করার পর এটি কাজ করতে বন্ধ করে দিতে পারে বা ওয়ার্নিং দিতে পারে।
এই কেসে, আপনি প্রোগ্রামকে এক্সটার্নাল ম্যানিফেস্ট ফাইল ব্যবহার করতে বাধ্য করতে পারেন। এক্সিকিউটেবল ফাইলের ডিরেক্টরিতে appname.exe.manifest (উদাহরণস্বরূপ, Autologon.exe.manifest) নামে একটি প্লেইন টেক্সট ফাইল তৈরি করুন এবং Resource Hacker থেকে ম্যানিফেস্ট কোড কপি করে পেস্ট করুন। requireAdministrator কে asInvoker-এ পরিবর্তন করুন। ম্যানিফেস্ট ফাইল সেভ করুন।
উইন্ডোজ সবসময় exe ফাইল লঞ্চ করার সময় এক্সটার্নাল ম্যানিফেস্ট ফাইল ব্যবহার করার চেষ্টা করতে, একটি স্পেশ্যাল রেজিস্ট্রি প্যারামিটার ইনএবল করুন:
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide" /v PreferExternalManifest /t REG_DWORD /d 1 /f
উইন্ডোজ রিস্টার্ট করুন এবং নিশ্চিত করুন প্রোগ্রাম এক্সটার্নাল ম্যানিফেস্ট ফাইল ব্যবহার করছে যা বলে অ্যাডমিনিস্ট্রেটর প্রিভিলেজ ছাড়া চালানোর জন্য।