batch-file - للصف - مشاريع الفيجوال بيسك جاهزة




كيفية طلب وصول المسؤول داخل ملف دفعي (8)

أحاول كتابة ملف دفعي للمستخدمين ليقوموا بتشغيله من أجهزة Vista الخاصة بهم باستخدام UAC. الملف هو إعادة كتابة ملف المضيف الخاص بهم ، لذلك يحتاج إلى تشغيل مع أذونات المسؤول. أحتاج إلى أن أتمكن من إرسال بريد إلكتروني إليهم يحتوي على رابط إلى ملف .bat. يتمثل السلوك المرغوب في أنه عند النقر بزر الماوس الأيمن على الملف والفتح ، سيحصلون على أحد مربعات حوار UAC التي تجعل الشاشة مظلمة ويجبرهم على الإجابة عما إذا كانوا يريدون إعطاء إذن للتطبيق ليعمل كمسؤول. بدلا من ذلك ، هم مجرد رؤية "رفض الوصول" على نافذة سطر الأوامر.

هل هذا ممكن القيام به بشكل مختلف؟


أعلم أن هذا ليس حلاً لـ OP ، ولكن بما أنني متأكد من أن هناك العديد من حالات الاستخدام الأخرى هنا ، أعتقد أنني سوف أشارك.

لقد واجهت مشاكل مع جميع أمثلة التعليمات البرمجية في هذه الإجابات ولكن بعد ذلك وجدت: http://www.robotronic.de/runasspcEn.html

فهو لا يسمح لك فقط بالعمل كمسؤول ، بل يقوم بفحص الملف للتأكد من أنه لم يتم العبث به ويقوم بتخزين المعلومات المطلوبة بشكل آمن. سوف أعترف أنها ليست الأداة الأكثر وضوحًا لمعرفة كيفية استخدامها ولكن بالنسبة لنا نحن الذين يكتبون الكود ، يجب أن تكون بسيطة بما فيه الكفاية.


إليك أحد الخطوط التي استخدمتها:

@echo off
if not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit)

echo main code here
pause

ملاحظات:

  • اختبار فقط على ويندوز 10 ، قد تضطر إلى الفوضى مع الاقتباس
  • لا يدعم تمرير الحجج في الوقت الراهن

استنادًا إلى مشاركة كتبها toster-cx وغيرها من المشاركات المثيرة للاهتمام في هذه الصفحة ، تلقيت إحصاءات حول كيفية تهيئة مشكلتي وحلها. كان لدي مشكلة مشابهة حيث تمنيت أن يتم تشغيل الأداة المساعدة "تنظيف القرص" كل أسبوع مرتين يومي الاثنين والخميس خلال ساعات الغداء (مثلاً 2 مساءً). ومع ذلك ، هذا يتطلب حقوق مرتفعة.

مشاركة ملف دفعي قد يساعد المبتدئين الآخرين مثلي -

@echo off
echo  Welcome to scheduling 'PC Maintenance Activity'
ping localhost -n 3 >nul
echo -- Step - 1 of 3 : Please give 'Admin' rights on next screen
ping localhost -n 5 >nul
if not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit)
cls
echo -- Step - 2 of 3 : In next screen, select temp areas for cleaning 
during routine scheduled activity
ping localhost -n 3 >nul
C:\Windows\System32\cleanmgr.exe /sageset:112
cls
echo    Now scheduling maintenance activity...
SchTasks /Create /SC WEEKLY /D MON,THU /TN PC_Cleanup /TR 
"C:\Windows\System32\cleanmgr.exe "/sagerun:112 /ST 14:00

cls

echo                         -- Thanks for your co-operation --
echo                    -- Maintenance activity is scheduled for --
echo                       -- Every Monday and Thursday at 2 pm --

ping localhost -n 10 >nul

شكرا جزيلا لهذا المنتدى و Rems POST هنا [ https://www.petri.com/forums/forum/windows-scripting/general-scripting/32313-schtasks-exe-need-to-pass-parameters-to-script][1]

ساعدت مشاركته في تكوين وسيطة اختيارية أثناء جدولة المهمة.


حل بن جريبكا يسبب حلقات لانهائية. تعمل هذه الدفعة على هذا النحو (رمز زائف):

IF "no admin privileges?"
    "write a VBS that calls this batch with admin privileges"
ELSE
    "execute actual commands that require admin privileges"

كما ترى ، يتسبب هذا في حلقة لا نهائية ، إذا فشل VBS طلب امتيازات المسؤول.

ومع ذلك ، يمكن أن تحدث حلقة لا نهائية ، على الرغم من طلب priviliges المشرف بنجاح.

الاختيار في ملف دفعي Ben Gripka هو عرضة للخطأ فقط. لعبت حولها مع الدفعة ولاحظت أن امتيازات المسؤول متاحة على الرغم من فشل الاختيار. ومن المثير للاهتمام ، أن الشيك يعمل كما هو متوقع ، إذا قمت بتشغيل ملف الدُفعات من مستكشف النوافذ ، ولكنه لم يحدث عندما بدأت تشغيله من الـ IDE الخاص بي.

لذلك أقترح استخدام ملفين دفعة منفصلة. ينشئ الأول VBS يستدعي ملف دفعي الثاني:

@echo off

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params = %*:"=""
echo UAC.ShellExecute "cmd.exe", "/c ""%~dp0\my_commands.bat"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"

الثانية ، المسمى "my_commands.bat" وتقع في نفس الدليل الأول تحتوي على الأوامر الفعلية الخاصة بك:

pushd "%CD%"
CD /D "%~dp0"
REM Your commands which require admin privileges here

هذا لا يؤدي إلى حلقات لا نهائية وأيضا إزالة الاختيار امتياز المشرف عرضة للخطأ.


نظرًا لأنني أواجه مشكلات في هذا البرنامج النصي ، ظهرت مرة أخرى موجه أوامر جديد مع نفسه ، في حلقة لا نهائية (باستخدام Win 7 Pro) ، أقترح عليك تجربة طريقة أخرى: كيف يمكنني رفع ملفي الدفعي تلقائيًا ، بحيث يطلب من حقوق المسؤول UAC إذا لزم الأمر؟

كن حذرًا ، يجب عليك إضافة هذا في نهاية النص البرمجي ، كما هو مذكور في التعديل ، بحيث تعود إلى دليل البرنامج النصي بعد رفع الامتيازات: cd / d٪ ~ dp0


نهج آخر هو

  • إنشاء اختصار محليًا وتعيينه لاستدعاء إذن المشرف [Properties، Advanced، Run as Admin]

وثم

  • إرسال الاختصار إلى المستخدمين [أو رابط إلى الاختصار بدلاً من واحد إلى ملف الدُفعات نفسه].

دينيس

[أضيفت بعد ذلك - نعم ، فشلت في ملاحظة تاريخ هذا الموضوع.]


هنا هو رمز بلدي! يبدو كبيرا ولكنه في الغالب خطوط التعليق (الخطوط التي تبدأ بـ: :).

ميزات:

  • إعادة توجيه الحجة الكاملة
  • لا يغير مجلد العمل
  • معالجة الأخطاء
  • يقبل المسارات التي تتضمن قوسين (باستثناء المجلد٪ TEMP٪)
  • يدعم مسارات UNC
  • فحص المجلد المعين (Warn) هل أنت في حالة عدم تمكن admin من الوصول إلى محرك الأقراص المعين

  • يمكن استخدامها كمكتبة خارجية (قم بمراجعة مشاركتي في هذا الموضوع: https://.com/a/30417025/4932683 )

  • يمكن استدعاؤها عند / إذا لزم الأمر في أي مكان في شفرتك

ما عليك سوى إرفاق هذا بنهاية الملف الدفعي الخاص بك ، أو حفظه كمكتبة (تحقق أعلاه)

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:RequestAdminElevation FilePath %* || goto:eof
:: 
:: By:   Cyberponk,     v1.5 - 10/06/2016 - Changed the admin rights test method from cacls to fltmc
::          v1.4 - 17/05/2016 - Added instructions for arguments with ! char
::          v1.3 - 01/08/2015 - Fixed not returning to original folder after elevation successful
::          v1.2 - 30/07/2015 - Added error message when running from mapped drive
::          v1.1 - 01/06/2015
:: 
:: Func: opens an admin elevation prompt. If elevated, runs everything after the function call, with elevated rights.
:: Returns: -1 if elevation was requested
::           0 if elevation was successful
::           1 if an error occured
:: 
:: USAGE:
:: If function is copied to a batch file:
::     call :RequestAdminElevation "%~dpf0" %* || goto:eof
::
:: If called as an external library (from a separate batch file):
::     set "_DeleteOnExit=0" on Options
::     (call :RequestAdminElevation "%~dpf0" %* || goto:eof) && CD /D %CD%
::
:: If called from inside another CALL, you must set "_ThisFile=%~dpf0" at the beginning of the file
::     call :RequestAdminElevation "%_ThisFile%" %* || goto:eof
::
:: If you need to use the ! char in the arguments, the calling must be done like this, and afterwards you must use %args% to get the correct arguments:
::      set "args=%* "
::      call :RequestAdminElevation .....   use one of the above but replace the %* with %args:!={a)%
::      set "args=%args:{a)=!%" 
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEDELAYEDEXPANSION & set "_FilePath=%~1"
  if NOT EXIST "!_FilePath!" (echo/Read RequestAdminElevation usage information)
  :: UAC.ShellExecute only works with 8.3 filename, so use %~s1
  set "_FN=_%~ns1" & echo/%TEMP%| findstr /C:"(" >nul && (echo/ERROR: %%TEMP%% path can not contain parenthesis &pause &endlocal &fc;: 2>nul & goto:eof)
  :: Remove parenthesis from the temp filename
  set _FN=%_FN:(=%
  set _vbspath="%temp:~%\%_FN:)=%.vbs" & set "_batpath=%temp:~%\%_FN:)=%.bat"

  :: Test if we gave admin rights
  fltmc >nul 2>&1 || goto :_getElevation

  :: Elevation successful
  (if exist %_vbspath% ( del %_vbspath% )) & (if exist %_batpath% ( del %_batpath% )) 
  :: Set ERRORLEVEL 0, set original folder and exit
  endlocal & CD /D "%~dp1" & ver >nul & goto:eof

  :_getElevation
  echo/Requesting elevation...
  :: Try to create %_vbspath% file. If failed, exit with ERRORLEVEL 1
  echo/Set UAC = CreateObject^("Shell.Application"^) > %_vbspath% || (echo/&echo/Unable to create %_vbspath% & endlocal &md; 2>nul &goto:eof) 
  echo/UAC.ShellExecute "%_batpath%", "", "", "runas", 1 >> %_vbspath% & echo/wscript.Quit(1)>> %_vbspath%
  :: Try to create %_batpath% file. If failed, exit with ERRORLEVEL 1
  echo/@%* > "%_batpath%" || (echo/&echo/Unable to create %_batpath% & endlocal &md; 2>nul &goto:eof)
  echo/@if %%errorlevel%%==9009 (echo/^&echo/Admin user could not read the batch file. If running from a mapped drive or UNC path, check if Admin user can read it.)^&echo/^& @if %%errorlevel%% NEQ 0 pause >> "%_batpath%"

  :: Run %_vbspath%, that calls %_batpath%, that calls the original file
  %_vbspath% && (echo/&echo/Failed to run VBscript %_vbspath% &endlocal &md; 2>nul & goto:eof)

  :: Vbscript has been run, exit with ERRORLEVEL -1
  echo/&echo/Elevation was requested on a new CMD window &endlocal &fc;: 2>nul & goto:eof
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

مثال على كيفية استخدامها

:EXAMPLE
@echo off

 :: Run this script with elevation
 call :RequestAdminElevation "%~dpfs0" %* || goto:eof

  echo/I now have Admin rights!
  echo/
  echo/Arguments using %%args%%:    %args%
  echo/Arguments using %%*: %*
  echo/%%1= %~1
  echo/%%2= %~2
  echo/%%3= %~3

  echo/
  echo/Current Directory: %CD%
  echo/
  echo/This file: %0
  echo/

pause &goto:eof

[here you paste the RequestAdminElevation function code]

@echo off title يمكن أن يأتي قبل هذا الرمز:

net session>nul 2>&1
if %errorlevel%==0 goto main
echo CreateObject("Shell.Application").ShellExecute "%~f0", "", "", "runas">"%temp%/elevate.vbs"
"%temp%/elevate.vbs"
del "%temp%/elevate.vbs"
exit

:main
    <code goes here>
exit

هناك الكثير من الإجابات الأخرى مبالغة إذا كنت لا داعي للقلق بشأن ما يلي:

  • المعلمات
  • دليل العمل ( cd %~dp0 سوف يتغير إلى الدليل الذي يحتوي على ملف الدُفعات)






elevated-privileges