آموزشی

چگونه فایل .bat را به صورت خودکار با Run as Administrator اجرا کنیم

سیستم عامل‌های جدید ویندوز از مکانیزمی به نام MIC جهت محدود کردن دسترسی به بخش‌های حساس ویندوز استفاده میکند و کاربران بطور معمول اعتبار Medium Integrity را دارا می‌باشند

در اجرا برنامه‌ها و یا اسکریپت‌ها که نیاز به دستری یا تغییر فایل‌های سیستمی و یا دسترسی به ریجستری ویندوزی نیازمند است در حالت Administrator به اجرا درآورید، آن وقت به صورت یک جا تمام دسترسی‌های سطح بالا در اختیار آن برنامه یا فایل قرار می‌گیرد. تنها در صورت اعطای این مجوز است که برنامه‌ها و فایل‌ها می‌توانند به فایل‌های سیستمی ویندوز دسترسی پیدا کنند. بنابراین برای اجرای صحیح و کامل بعضی برنامه‌ها، ارائه مجوز Run as Administrator الزامیست.

راه‌های ساده ای مانند کلیک راست و Run as Administrator و گزفتن Shift + Ctrl  و اجرا برنامه و روش Compatibility Properties برای اجرا موجود است

چگونه فایل .bat را به صورت خودکار با Run as Administrator اجرا کنیم

در این مطلب در ادامه آموزش اسکریپت نویسی فایل .bat می‌خواهیم نیاز نباشد کاربر از روش‌های بالا Run as Administrator انجام بدهد و با اجرا فایل بصورت خودکار در سطح دسترسی Administrator اجرا شود.

مطالعه مطالب و آموزش‌های قبلی مفید می‌باشد:

درباره Batch File و دستورات CMD و .BAT

کد اول

برای اینکار به سادگی می‌توانید متن زیر را به ابتدای فایل اسکریپت اضافه کنید و بعد  از :start کد اسکریپت خود را قرار دهید


@echo off
setlocal EnableDelayedExpansion & cd /d "%~dp0"
%1 %2
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :start","","runas",0)(window.close)&exit
:start

این دستور با استفاده از vbscript فایل باز شده را با دسترسی Administrator  دورباره اجرا می‌کند و جهت ادامه کار goto به :start می‌ژند و ادامه اسکریت‌ را اجرا می‌کند و پنجره اجرای عادی فایل را می‌بندد.

 

 

کد دوم

برای استفاده از این روش متن زیر را در .bat کپی کنید و  کد اکریپت مورد نظر را در محل <YOUR BATCH SCRIPT HERE> جاگذاری کنید
@echo off
call :isAdmin
if %errorlevel% == 0 (
goto :run
) else (
echo Requesting administrative privileges...
goto :UACPrompt
)
exit /b
:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b
:run
<YOUR BATCH SCRIPT HERE>
exit /b
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", "/c %~s0 %~1", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B`

این اسکریپت با دستور call زیر‌مجموعه دستور ایجاد می‌کند و در قسمت:isAdmin توسط دستور fsutil dirty query %systemdrive% (این دستور نام درایو ویندوز را میپرسد از انجا که این کار به دسترسی ادمین نیاز دارد در اینجا استفاده شده است) و چک کردن %errorlevel%  بررسی دسترسی ادمین را انجام می‌دهد اگر دسترسی ادمین باشد اسکریپت شما اجرا می‌شود در غیر این صورت یک فایل getadmin.vbs در پوشه temp ویندوز با دستور اجرای cmd.exe در حالت   Run as Administrator و مسیر دادن خود اسکریت فایل دسترسی را مجدد بررسی میکند. در انتها هم فایل getadmin.vbs را حذف می‌کند

 

 

امیر فدائیان

عاشق تکنولوژی هستم،مشغول برنامه نویسی و همچنین پشتیبانی و نصب سیستم های نظارتی و حفاظتی هست، در اين وبلاگ علاوه بر اينكه دفترچه ياداشتي براي خودم هست ،تجربیات و دانسته‌هام در حوزه نرم‌افزار ،اينترنت ،تلفن همراه و ... را منتشر ميكنم. Programming languages: Delphi, Kotlin, Python, SQL Server

نوشته های مشابه

‫16 دیدگاه ها

  1. سلام مهندس جان
    با تشکر فراوان از آموزش های عالیتون

    من میخوام اسکریپتی درست کنم که یوزر و پسورد آدمین رو بهش بدم که وقتی اجراش کنم با دسترسی یوزر ادمین اجرا بشه و یک سری دستورات رو انجام بده؟

    ممنون میشم راهنمایی بفرمایید

    با تشکر

    1. سلام
      شما می‌توانید از دستور Runas استفاده کنید
      برای مثال
      Runas /noprofile /user:ComputerName\USER "notepad.exe"

      سینتکس دستور اینگونه است

      runas /noprofile /user:ComputerName\USER /savecred "Path"
      ::RUNAS [ [/noprofile | /profile] [/env] [/savecred | /netonly] ]
      ::/noprofile Do not load the user's profile
      ::/profile Load the user's profile. (default)
      ::/env Use the current environment instead of user's.
      ::/netonly Use the credentials for remote access only.
      ::/savecred Use credentials previously saved by the user.
      ::/smartcard Load the credentials from a smartcard.
      ::/user UserName in the form USER@DOMAIN or DOMAIN\USER
      ::/trustlevel Level One of levels enumerated in /showtrustlevels.
      ::program The program to run.

      سویچ /savecred باعث ذخیره شدن کلمه عبور برای استفاده هیا بعدی می‌شود
      موفق باشین

      1. با تشکر مهندس جان

        سوال من اینه که من میخوام این فایل رو بدم به یوزرهایی با دسترسی محدود و میخوام که پسورد رو توی این فایل اسکریپت قرار بدم و تبدیل به exe کنم که بتونم یه کارها رو انجام بده برام بدون اینکه از یوزر پسورد بپرسه.

        ممنونم

      2. دوست عزیز من با همین دستوری که گفتم انجام میدم
        ببنین قرار دادن رمز کاربر در داخل فایل باعث لو رفتنش میشه برای همین سویچ /savecred باعث میشه که بصورت امن این کلمه عبور در ویندوز ذخیره بشه

        برای مثال من یک یوزر به نام amir دارم رمز اون هم ۱۲۳۴ هست نام سیستم هم fbshdf-PC است و میخوام برنامه رو با دسترسی این کاربر اجرا کنم

        یک فایل Bat با متن زیر ایجاد میکنم
        Runas /user:fbshdf-PC\amir /savecred "C:\Program Files\TimexAW\AmirWebTimex.exe"


        وقتی برای بار اول اجرا میکنم از من کلمه عبور پرسیده میشه
        اگر کلمه عبور درست باشه در دفعات بعد برنامه بصورت خودکار با همون دسترسی اجرا میشه
        در صورتی که سویچ /savecred رو ننویسین در هر برار اجرا کلمه عبور خواسته میشه
        امید وارم درست متوجه شده باشم و ای راه حل مفید باشه

        من از این روش در داخل شبکه و دامین و هم در تک سیستم استفاده کرده

  2. سلام وقت بخیر.یک سوال داشتم.میخواستم ببینم چجوری میتونم از چند دستور متفاوتی که درون بچ فایلم نوشتم بعد از اجرا یک فایل ریپورت درون هاردم ذخیره بشه.برای مثال من یک بچ فایل درست کردم که درونش اول کد چک کردن اطلاعات کامپیوتر نوشتم بعد چک کردن مشخصات کارت گرافیک و بعد رم و بعد هارد،میخواهم از همه اینها یک ریپورت یک جا درون هارد بهم بده،ممنون میشم راهنمایی کنید

    1. سلام
      برای مثال می توانید از دستور
      ping 8.8.8.8 >>output.txt
      استفاده کنید

      برای حالت پیشرفته اینچنین


      @echo off
      >output.txt (
      echo Checking your system infor, Please wating...
      systeminfo | findstr /c:"Host Name"
      systeminfo | findstr /c:"Domain"
      ipconfig /all | find "Physical Address"
      ipconfig | find "IPv4"
      ipconfig | find "Default Gateway"
      )
      @pause

  3. ممنونم از وقتی که گذاشتید.اما امکانش هست واضح تر توضیح بدید.من انجام میدم ارور میده.دستور bat فایلم هم اسن است

    @echo off

    title TEST DOS

    systeminfo

    wmic path win32_videocontroller get name

    wmic memorychip

    wmic diskdrive get size,model,index,status

    pause

  4. تست کردم همه اطلاعات ذخیره میکنه به جز اصلاعات هارد که میشه دستور اخر.دلیلش به نظرتون چیه؟

    1. برای من مشکلی نداره و کلیه دستورات رو میاره
      شما یکبار به این صورت تست کن که در فایل‌های جداگانه بده

      @echo off
      title TEST DOS
      systeminfo >systeminfo.txt
      wmic diskdrive get size,model,index,status >diskdrive.txt
      wmic path win32_videocontroller get name >videocontroller.txt
      wmic memorychip >memorychip.txt
      @pause

  5. سلام من یک دامین دارم که 600 تا کلاینت داره و برای اکتیو کردن ویندوز و آفیس این کلاینت ها به مشکل بر خوردم.سرور kms server رو راه اندازی کردم و الان مشکلی که دارم نمیتونم برم پشت تک تک سیستم ها kms server رو ست کنم.میخوام یک batch فایل داشته باشم که در اون دستورات ست کردن ادرس kms server و اکتیو کردن ویندوز در اون قرار بگیره به صورتی که وقتی فایل اجرا شد به صورت اتومات با دسترسی ادمین دامین که دسترسی اجرای فایل های bat رو داره اجرا بشه و اتومات ویندوز و آفیس رو اکتیو کنه.آیا راه حلی برای این مشکل وجود داره؟
    راه حل سریعتر و بهتر دیگه ای نیست که بهم معرفی کنید؟

  6. سلام
    من d; فایل vbs برای باز کردن و بستن پورت سوییچ T از طریق telnet با cmd ایجاد کردم .
    میخوام اتوماتیک در ساعتهای خاص یک پورت سوییچ فعال و غیر فعال بشه.در task scheduler که میزنم فقط پنجره ی cmd باز میشه و دستورات اجرا نمیشوند .

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا