从C#中的标准帐户以管理员身份运行批处理文件

时间:2016-09-13 08:45:20

标签: c# windows batch-file

我正在开发一个需要运行具有普通人帐户管理员权限的批处理文件的应用程序。一切正常 当我登录到计算机管理员帐户但不在"测试帐户中时#34;没有管理员权限。我确实得到了所有的信息 从我的App.config文件中需要登录到管理员帐户。

我的第一次尝试是以StartInfo作为ceratin用户(admin用户)运行该进程。但是,如果我用

运行该过程
p.StartInfo.Verb = "runas";

然后我需要设置

p.StartInfo.UseShellExecute = true; 
运行runas

为true。但如果我这样做,我会得到这个例外:

System.InvalidOperationException: The Process object must have the UseShellExecute property set to false in order to start a process as a user.

我将UseShellExecute更改为false,但是我无法使用" runas"运行它,并且它启动了没有管理员权限的进程。 runas仅在Value时有效 UseShellExecute设置为true。

此解决方案的代码:

string domain = config.AppSettings.Settings["domain"].Value;
string user = config.AppSettings.Settings["user"].Value;
string password = config.AppSettings.Settings["password"].Value;

try
{

        Process p = new Process();

        p.StartInfo.FileName = installationPath;
        p.StartInfo.Verb = "runas";

        System.Security.SecureString ssPwd = new System.Security.SecureString();
        for (int x = 0; x < password.Length; x++)
        {
            ssPwd.AppendChar(password[x]);
        }

        p.StartInfo.UseShellExecute = false;
        p.StartInfo.UserName = user;
        p.StartInfo.Password = ssPwd;

        p.Start();

        cmdRun.Enabled = false;

        p.WaitForExit();

}
        catch (Exception exc)
{

    Debug.WriteLine(exc);

}

我的第二个选择是使用模拟。我在代码中以管理员用户身份登录,然后运行该过程。这一切都很好,登录 我试图打印WindowsIdentity.CurrentUser(),它显示了计算机管理员用户的名称。这意味着冒充 作品。但是当我使用UseShellExecute运行代码为true(运行&#34; runas&#34;)时,我得到了这个例外:

A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll
System.ComponentModel.Win32Exception: Unknown error (0xfffffffe)
   at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()

如果我用UseShellExecute作为false运行它,没有任何反应,没有异常,但也没有安装。因为它无法将UseShellExecute的runas用作false。

此解决方案的代码:

string domain = config.AppSettings.Settings["domain"].Value;
string user = config.AppSettings.Settings["user"].Value;
string password = config.AppSettings.Settings["password"].Value;

using (new Impersonation(domain, user, password))
{

    try
    {

        Process p = new Process();

        p.StartInfo.FileName = installationPath;
        p.StartInfo.Verb = "runas";
        p.StartInfo.UseShellExecute = true;

        p.Start();

        cmdRun.Enabled = false;

        p.WaitForExit();

    }
    catch (Exception exc)
    {

        Debug.WriteLine(exc);

    }
}

我想要的只是以管理员身份运行批处理文件,最好还禁用UAC。只需为用户顺利安装。 我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

我&#34;欺骗&#34; UAC,是您创建批处理文件,并创建计划任务以使用最高权限(没有活动计划)运行它 然后,您可以从另一个批处理文件运行计划任务 - 从而完全避开UAC。

只会找到一个示例并更新

编辑: 我无法找到我正在使用的示例,但这里有一个描述技术的链接http://www.techrepublic.com/blog/windows-and-office/run-uac-restricted-programs-without-the-uac-prompt/

编辑二: 在我的情况下,我使用它来启动TeamViewer计算机启动后,使用vbscript,但程序应该是相同的: 我创建了一个计划任务,使用&#34;以最高权限运行&#34;在文件夹UACWhiteList中调用TeamViewStartDelayedUAC,然后运行命令

runLine = "C:\Windows\System32\schtasks.exe /RUN /TN ""UACWhitelis\TeamViewStartDelayedUAC"""

DIM MyShell
Set MyShell = CreateObject("WScript.Shell")

MyShell.Run runLine,1,false