从c#aspx应用程序运行桌面应用程序时,注册表访问被阻止

时间:2018-01-19 05:12:16

标签: c# asp.net web-applications registry

我有一个用C#编写的ASPX Web应用程序,我在其中使用ProcessStartInfo对象从网页上的按钮调用在云Web服务器计算机上运行的桌面应用程序。尝试访问HKCU / Software中的注册表项时,应用程序(SetTags)失败并出现安全性违规。为了解决这个问题,我将ProcessStartInfo动词从'open'更改为'runas',并将UseShellExecute设置为true,这应该启动具有管理员权限的桌面应用程序。 UAC已在云服务器计算机上关闭。但是,桌面应用程序崩溃时会在事件日志中记录安全性异常,如下所示

Exception Info: System.Security.SecurityException
   at System.ThrowHelper.ThrowSecurityException(System.ExceptionResource)
   at Microsoft.Win32.RegistryKey.OpenSubKey(System.String, Boolean)
   at Global.Common..cctor()

Exception Info: System.TypeInitializationException
   at Global.Common.ShowUserError(System.String, System.String)
   at SetTagsNS.Program.Main(System.String[])

在将任何数据写入日志文件之前发生崩溃,并且Common.ShowUserError代码不包含任何显式的Registry调用。它如下:

public static void ShowUserError(string sMsg, string sCaption = "")
    {
        if (CallingArgs == null) MessageBox.Show(sMsg, sCaption);
        else
            if (CallingArgs.GetUpperBound(0) != -1)
            {
                if(sErrFile!="") 
                {
                    StreamWriter Err = new StreamWriter(sErrFile,true); // 2nd param = true to append error
                    // Redirect standard error from the console to the error file.
                    Console.SetError(Err);
                    Err.Close();
                }
                else Console.Error.Write(sMsg);
            }

            else MessageBox.Show(sMsg, sCaption);
    }

桌面应用程序使用VS2013作为Windows应用程序而不是控制台应用程序构建在C#中,但如果使用命令行参数启动,则可以选择不显示任何窗口。当应用程序使用命令行参数启动时,控制台将附加到应用程序以记录消息。这样做是为了为Web应用程序和桌面应用程序使用相同的代码库。

桌面应用程序可以从.bat文件中的管理员帐户在云Web服务器(Server2016 OS)上成功运行,使用与从aspx页面调用时相同的参数。 runas / trustlevel = 0x20000用于使应用程序仅使用基本用户权限运行

从aspx页面调用桌面应用程序时,如何允许桌面应用程序访问注册表?

1 个答案:

答案 0 :(得分:0)

允许在Web服务器上运行的可执行文件的行为类似于在桌面上运行的相同可执行文件并使用注册表的关键是为Web应用程序运行Identity的应用程序池提供特权帐户,例如Administrator,而不是比默认的ApplicationPoolIdentity。这允许访问注册表,但桌面应用程序可能使用的其他内容(例如特殊文件夹位置(例如AppData))可能仍然不同。 (它可能会打开一个安全漏洞,但在我的情况下,服务器不包含敏感数据。)然后在Process.StartInfo中使用runas谓词允许可执行文件像桌面可执行文件那样运行。

回想起来,建议网络应用程序应该只是共享一些代码库(如建议的那样)可能工作量较少,但由于我对桌面应用程序开发非常熟悉,我认为最好的方法就是简单从命令行运行exe时删除UI,然后让Web应用程序处理该接口。和以往一样,经验保持着一所亲爱的学校。一旦知道了陷阱(注册表访问,特殊文件夹,任何UI交互),它肯定有可能以这种方式运行。从想要找出为什么蝙蝠文件在Web服务器桌面上运行而不是从Web应用程序运行的人数来看,这些差异应该更广为人知。