প্রোগ্রামটিমেটিক্যালি প্রসেসের সুবিধাদি বাড়ানো?


147

আমি ইনস্টলটুল.এক্স.ই.সি. ব্যবহার করে একটি পরিষেবা ইনস্টল করার চেষ্টা করছি তবে এর মাধ্যমে অনুরোধ করেছি Process.Start। কোডটি এখানে:

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);

যেখানে m_strInstallUtilসম্পূর্ণরূপে যোগ্য পাথ এবং "ইনস্টলটুইট.এক্সই" এর জন্য এক্সপ্লে এবং strExePathআমার পরিষেবায় সম্পূর্ণরূপে যোগ্য পাথ / নাম।

একটি উন্নত কমান্ড প্রম্পট থেকে কমান্ড লাইন সিনট্যাক্স চালানো কাজ করে; আমার অ্যাপ থেকে চলমান (উপরের কোডটি ব্যবহার করে) তা করে না। আমি ধরে নিয়েছি যে আমি কিছু প্রক্রিয়া উন্নয়নের সমস্যাটি নিয়ে কাজ করছি, তবে আমি কীভাবে আমার প্রক্রিয়াটিকে একটি উন্নত অবস্থায় চালাব? আমার কি এটি দেখার দরকার আছে ShellExecute?

উইন্ডোজ ভিস্তার এ সবই। আমি প্রশাসনিক সুবিধায় উন্নত VS2008 ডিবাগারে প্রক্রিয়াটি চালাচ্ছি।

আমি সেটিংয়ের চেষ্টাও করেছি startInfo.Verb = "runas";তবে সমস্যার সমাধান হবে বলে মনে হচ্ছে না।


আমি যোগ করেছি startInfo.UseShellExecute = true;ছাড়াও startInfo.Verb = "runas";এটা আমার জন্য জরিমানা করেন।
ম্যাট

উত্তর:


172

আপনি সূচনা করতে পারেন যে নতুন প্রক্রিয়াটি আপনার স্টার্ট ইনফোর অবজেক্টটির 'রুনাস' এ ভার্বাইটি সম্পত্তি সেট করে উন্নত অনুমতি নিয়ে শুরু করা উচিত:

startInfo.Verb = "runas";

এটি উইন্ডোজের সাথে এমন আচরণ করবে যে প্রক্রিয়াটি "অ্যাডমিনিস্ট্রেটর হিসাবে রান করুন" মেনু কমান্ড দিয়ে এক্সপ্লোরার থেকে শুরু করা হয়েছে।

এর অর্থ এই নয় যে ইউএসি প্রম্পট আসবে এবং ব্যবহারকারীর কাছে তাকে স্বীকৃতি দেওয়া দরকার: যদি এটি অনাকাঙ্ক্ষিত হয় (উদাহরণস্বরূপ এটি দীর্ঘ প্রক্রিয়ার মাঝামাঝিতে ঘটবে) তবে আপনাকে আপনার সম্পূর্ণ হোস্ট প্রক্রিয়াটি চালনাতে হবে অ্যাপ্লিকেশন ম্যানিফেস্ট (ইউএসি) তৈরি এবং এম্বেড করে উচ্চতর অনুমতিগুলি 'সর্বোচ্চ উপলব্ধ' এক্সিকিউশন স্তরের প্রয়োজন হয়: এটি আপনার অ্যাপ্লিকেশনটি শুরু হওয়ার সাথে সাথে ইউএসি প্রম্পটটি উপস্থিত হতে পারে এবং সমস্ত শিশু প্রক্রিয়াগুলি অতিরিক্ত অনুরোধ ছাড়াই উন্নত অনুমতি নিয়ে চালিত করবে ।

সম্পাদনা: আমি দেখতে পাচ্ছি যে আপনি "রুনাস" আপনার পক্ষে কাজ করে না তা উল্লেখ করার জন্য আপনার প্রশ্নটি সম্পাদিত হয়েছে। এটি সত্যই অদ্ভুত, যেমনটি হওয়া উচিত (এবং বেশ কয়েকটি প্রোডাকশন অ্যাপ্লিকেশনে আমার জন্য তা করে)। ম্যানিফেস্ট এম্বেড করে অভিজাত প্রক্রিয়াটি উন্নত অধিকারের সাথে চালিত হওয়া অবশ্যই কাজ করা উচিত।


9
"রুনাস" আমার পক্ষেও কাজ করেনি। এটি কি কেবল ইউএসি বন্ধ করে কাজ করে?
ডার্ক ভোলমার

18
@ লুকাকাপলেট আমি তাদের ধন্যবাদ জানাই ব্যবহারকারীর ভূমিকা সম্পূর্ণরূপে আলাদা না করেই রুট-কিট ইনস্টলেশনটি প্রশমিত করার এক দুর্দান্ত উপায়।
কল্টন

6
@ স্পার্কসিস, তবে এর সাথে আরও একটি দৃষ্টিভঙ্গি রয়েছে। যে লোকেরা কীভাবে তাদের ওএস রক্ষা করতে জানে, তারা ইউএসি ছাড়াই এটি কীভাবে করবেন তা জানেন। এবং ডামি ব্যবহারকারীরা, যারা প্রতিরক্ষা কী তা জানেন না, তারা ইউএসি উইন্ডোটি দেখলে প্রতিবার 'হ্যাঁ' ক্লিক করছেন are এছাড়াও খারাপ-হ্যাকার-ভাইরাস-লেখকদের এটিকে বাইপাস চালানোর কাজে ব্যবহার করতে বাধা দিতে পারে না;) সুতরাং আমি লূকপ্লেট =) এর সাথে একমত
জেট

24
দেখে মনে হচ্ছে startInfo.ShellExecute=trueএটি কাজ করার জন্য আপনাকেও সেট করতে হবে ... এছাড়াও আমি এই পদ্ধতিটি কোনও নেটওয়ার্ক শেয়ারে থাকা এক্সিকিউটেবল ফাইলগুলির সাথে কাজ করতে সক্ষম হতে পারিনি (চালানোর আগে তাদের স্থানীয় টেম্প ডিরেক্টরিতে অনুলিপি করতে হবে)। ..
টিসিসি

7
@ জেট দুঃখিত তবে এটি ভুল মানসিকতা। প্রতিবার ইনস্টল করার সময় কোনও ইউএসি ডায়ালগ প্রদর্শিত হয়, এটি সিস্টেমের ব্যর্থতা। আপনি যখন কোনও ইউএসি বক্স দেখেন যখন কোনও উন্নতির প্রয়োজন হয় না তখন এটি মূল্যবান। আপনি কীভাবে প্রো-প্রোডাক্ট হন - আমাদের যে কেউ মনে করেন যে আমরা আমাদের পিসিতে রয়েছি, আপনি জাদুতে শূন্য দিন / ড্রাইভ বাই ডাউনলোডগুলি ব্লক করতে পারবেন না (যেমন সরকারী নোবেল পুরস্কার সাইটের সাম্প্রতিক একটি)। আপনি যদি সেই সাইটটিতে ব্রাউজ করেন এবং কোনও ইউএসি প্রম্পট পেয়ে থাকেন তবে আপনি জানতেন যে এখানে কিছু ভুল ছিল। ইউএসি বন্ধ থাকলে আপনি কখনই জানতে পারবেন না যে আপনি কেবল বোটনেটে যোগ দিয়েছেন। অগ্রিম সতর্কতার ব্যয় হ'ল মাঝেমধ্যে হ্যাঁ ক্লিক করতে হবে
বেসিক

46

এই কোডটি উপরের সমস্তগুলিকে একসাথে রাখে এবং প্রশাসনিক বিভাগগুলির সাথে বর্তমান ডাব্লুপিএফ অ্যাপ্লিকেশনটি পুনরায় চালু করে:

if (IsAdministrator() == false)
{
    // Restart program and run as admin
    var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
    ProcessStartInfo startInfo = new ProcessStartInfo(exeName);
    startInfo.Verb = "runas";
    System.Diagnostics.Process.Start(startInfo);
    Application.Current.Shutdown();
    return;
}

private static bool IsAdministrator()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(identity);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}


// To run as admin, alter exe manifest file after building.
// Or create shortcut with "as admin" checked.
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas".
// Or an elevate vbs script can launch programs as admin.
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass)

আপডেট: অ্যাপ্লিকেশন ম্যানিফেস্ট উপায় পছন্দ করা হয়:

ভিজ্যুয়াল স্টুডিওতে প্রজেক্টটি ডান ক্লিক করুন, যুক্ত করুন, নতুন অ্যাপ্লিকেশন ম্যানিফেস্ট ফাইলটি, ফাইলটি পরিবর্তন করুন যাতে আপনার উপরে অ্যাডমিনিস্ট্রেটর সেট করতে হবে উপরের মত দেখাচ্ছে।

মূল উপায়ে একটি সমস্যা: আপনি যদি app.xaml.cs অন স্টার্টআপে পুনঃসূচনা কোডটি রাখেন তবে এটি শাটডাউন বলা হলেও মূল উইন্ডোটি সংক্ষেপে শুরু করতে পারে। আমার প্রধান উইন্ডোটি ফুঁসে উঠেছে যদি app.xaml.cs আরম্ভ না চালানো হয় এবং নির্দিষ্ট রেসের পরিস্থিতিতে এটি এটি করে।


উন্নতির জন্য নীচে দেখুন।
জেসিসিসি

প্রয়োজনীয় প্রশাসক আমার ক্ষেত্রে কাজ করেনি। সুতরাং আমি এটি আপনার উপায় করতে হয়েছিল। এটি আমার সমস্যার সমাধান! ধন্যবাদ. তবে আমাকে সিঙ্গল ইনস্ট্যান্স অ্যাপ্লিকেশনটি মিথ্যা হিসাবে সেট করতে হয়েছিল।
ক্রিস

এটি আমার পক্ষে কাজ করেছে। আমি আসল string[] argsপ্রক্রিয়াটিও পাস করেছি ।
ডটনেটপদাওয়ান

21

ক্রিস কোরিও নিবন্ধ অনুসারে : আপনার অ্যাপ্লিকেশনগুলিকে উইন্ডোজ ভিস্তার ইউজার অ্যাকাউন্ট কন্ট্রোল দিয়ে সুন্দরভাবে খেলতে শেখান, এমএসডিএন ম্যাগাজিন, জানুয়ারী 2007 , কেবল ShellExecuteএমবেডেড ম্যানিফেস্টটি পরীক্ষা করে এবং প্রয়োজনে ব্যবহারকারীকে উন্নতির জন্য অনুরোধ জানায়, CreateProcessএবং অন্যান্য API গুলি না করে। আশা করি এটা সাহায্য করবে.

এছাড়াও দেখুন: .chm হিসাবে একই নিবন্ধ


7
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]

এটি ইউএসি ছাড়াই এটি করবে - নতুন প্রক্রিয়া শুরু করার দরকার নেই। যদি চলমান ব্যবহারকারী আমার ক্ষেত্রে কেস হিসাবে অ্যাডমিন গ্রুপের সদস্য হন।


3
এই কোডটি ব্যবহার করে আমি একটি অনুমতি ত্রুটি পেয়েছি: "সুরক্ষা সত্তার অনুমতিের অনুরোধ ব্যর্থ হয়েছে।" :(
লিওনার্দো

সম্ভবত "যদি চলমান ব্যবহারকারী অ্যাডমিনের
মেমবার হয়

1
আকর্ষণীয় - এটি যে কোনও পদ্ধতিতে যেতে পারে, কেবলমাত্র একটি ক্রিয়া পদ্ধতি নয় (আমি এটিএসপিএক্স পৃষ্ঠায় সংজ্ঞায়িত পদ্ধতিতেও চেষ্টা করেছি)
সাইমন_উইভার

1

রাষ্ট্রকে উন্নত করতে আপনার ছদ্মবেশ ব্যবহার করা উচিত।

WindowsIdentity identity = new WindowsIdentity(accessToken);
WindowsImpersonationContext context = identity.Impersonate();

আপনার কাজ শেষ হয়ে গেলে ছদ্মবেশী প্রসঙ্গটি পূর্বাবস্থায় ফিরিয়ে রাখতে ভুলবেন না।


28
অ্যাক্সেস টোকেন কীভাবে পাবেন তা আপনি বলেননি। লগন ইউজার যখন ইউএসি সক্ষম হয় তখন ব্যবহারকারীর সীমাবদ্ধ সুরক্ষা প্রসঙ্গ সরবরাহ করবে।
cwa

আপনি যদি ভিএসটিএস ব্যবহার করে থাকেন তবে আপনি ওয়েব পোর্টালের সেটিংস থেকে ব্যক্তিগত অ্যাক্সেস টোকন পেতে পারেন। (ব্যবহারকারীর ছবির পাশে সেটিংস আইকনটি সন্ধান করুন)) এমএসডোকস
সু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.