从 asp.net 调用服务器上的 exe

Posted

技术标签:

【中文标题】从 asp.net 调用服务器上的 exe【英文标题】:calling exe on server from asp.net 【发布时间】:2011-09-05 00:06:44 【问题描述】:

想在我的服务器上运行 asp.net 的 exe,这可能吗?

我用这个方法:

    System.Diagnostics.Process process1 = new System.Diagnostics.Process();
    // Set the directory where the file resides

    process1.StartInfo.WorkingDirectory = @"D:\dev\Analyzer\bin\Release";
    // Set the filename name of the file you want to open

    process1.StartInfo.FileName = @"D:\dev\Analyzer\bin\Release\Analyzer.exe";
    process1.StartInfo.Arguments = "123";
    // Start the process

    process1.Start();

当我调试它时它可以工作,但是当我把我的网站放在本地主机上时,我有异常:

用户“IIS APPPOOL\dq”登录失败

其中 dq 是我的网站名称。

堆栈:

System.Data.SqlClient.SqlException (0x80131904):用户 'IIS APPPOOL\dq' 登录失败。在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔型 breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) 在 System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, SqlConnection owningObject) 在 System.Data。 System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject,TimeoutTimer 超时,SqlConnectionString connectionOp在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) 在 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions)在 System.Data 的 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) 的 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) 的选项、对象 poolGroupProviderInfo、DbConnectionPool 池、DbConnection owningConnection)。 ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBas e.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.SqlClient.SqlConnection.Open() at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) at System.Data.Linq.SqlClient.SqlProvider .get_IsSqlCe() 在 System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() 在 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(表达式查询) 在 System.Data.Linq .DataQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator() at Analyzer.Program.Main(String[] args) 在 D:\dev\Analyzer\Program.cs:line 59

【问题讨论】:

请提供完整的异常细节。如果没有细节,说抛出异常是没有用的。 网站使用什么用户帐户,是否有权访问这些文件? 此外,它还需要某些 .net 权限,而大多数主机可能不会授予这些权限。 你在哪一行得到这个异常?它与您发布的代码无关,除非这是由您的analyser.exe 抛出的。 还有什么例外?我假设TdsParser 被 SQL 卡住了。 【参考方案1】:

我在这里假设您遇到的异常是访问冲突。

如果是这种情况,您需要确保使用 UserNamePassword 启动进程,以获得具有足够权限来运行可执行文件(并访问它所在的目录)的帐户,或者设置具有此类帐户的应用程序池。


更新:

堆栈跟踪指向错误的 LINQ 查询,而不是 Process.Start。究竟是什么异常?我无法从痕迹中分辨出来。

这是什么线?


更新 2:

检查您的连接字符串和 SQL Server - 站点帐户无法登录 SQL Server。这与Process.Start 或LINQ 语法完全无关。

您是否设置了正确的密码?如果您使用集成安全 (SSPI=true),您是否确保 SQL Server 已启用此登录?

【讨论】:

如何从 asp 中“使用具有足够权限的帐户的用户名和密码启动该过程”? @kosnkov - 您使用进程对象的Process.StartInfo 属性的UserNamePassword 属性,提供具有足够权限的帐户的凭据。 异常是用户 'IIS APPPOOL\dq' 登录失败 @kosnkov - 那么您的 Web 应用程序无法登录到 SQL Server。连接字符串是否正常? SQL Server 上的帐户设置是否正确? 当我点击这个analyzer.exe时它会工作,但是作为从asp运行的进程会抛出这个sql异常。我该怎么办?【参考方案2】:

完全不推荐这种方法。在服务器上,您的 ASP.NET 网站也作为进程运行。 启动另一个进程需要一些额外的权限。工作进程正在尝试使用自己的用户 (IIS APPPOOL\dq) 帐户启动 Analyzer.exe,但在那里失败了。您需要使用另一个帐户运行您的工作进程,该帐户将具有足够的权限来启动另一个可执行文件。

顺便说一句,这将打开您的威胁区域。完全不推荐。

谢谢 高拉夫

【讨论】:

以上是关于从 asp.net 调用服务器上的 exe的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery 调用 ASP.NET Web 服务?

如何从网页 (asp.net) 启动 EXE

从 asp.net c# 应用程序调用 Sav32Cli.exe “代码 2 - 如果发现阻止进一步执行的错误”

想询问下怎么在网页中运行exe文件,asp.net 或html中 ,谢谢!

如何在 reportviewer 控件上从 asp.net 调用打印?

如何从网站在客户端上执行应用程序?