Win32Exception (0x80004005): 拒绝访问。

josxhn 2011-05-18 04:12:41
ASP.Net + C# + SQLServer 2005 + IIS 5.1 服务器环境 XP SP3
在我自己的笔记本环境中调试都是好的,到服务器上部署就出问题了,在网上查了一整天的解决方案,大致问题所在也了解了,应该是杀进程的时候权限不够,但郁闷的是网上所有的解决方案都试过了还是没用。

报错部分代码:

[DllImport("User32.dll" , CharSet = CharSet.Auto)]
private static extern int GetWindowThreadProcessId(IntPtr hwnd , out int ID);

//End the process of xlApp
public void KillExcelProcess()
{
//get the hwnd(t) of excel, it is the entrance of memory used by excel
IntPtr t = new IntPtr(xlApp.Hwnd);
int k = 0;
//get the id(k) of process by hwnd(t)
GetWindowThreadProcessId(t , out k);
//get the reference of process(p) by id(k)
Process p = Process.GetProcessById(k);
//kill the process
p.Kill();
}


以下是我试过但无效的解决方案:
解决方案1:
修改 C:\Windows\Microsoft.Net\framework\v2.0.50727\Config\machine.config 文件
<processModel userName="machine" 改成 "system"/>

解决方案2:
用户权限设置不当引起的
一般通过在WEB站点的目录安全性中编辑“匿名访问和验证控制”的验证方法改为,ASPNET用户,就可以解决这个问题了。
这里我设置了ASPNET和Administrator以及IUSR_机器名以及对应密码都没有用

解决方案3:
原因: 用户没有结束Excel进程的权限。解决方案:
1.在WEBCONFIG中使用
<identity impersonate="true" userName="Administrator" password="admin"/>
放在<system.web>标签中
2.或者将ASP.NET设为管理员权限(IIS5及以下),或者NETWORKSERVICE(IIS6)

解决方案4:
控制面板-管理工具-计算机管理-本地用户和组-组-双击“Administrators”-
向其中添加ASPNET或"IIS网站属性中匿名访问时用到的帐号密码"
最省事的是添加everyone
...全文
1922 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
“C:\Windows\Microsoft.NET\Framework\vX.X.XXXXXX\Temporary ASP.NET Files”这个文件夹做user、network service、asp.net权限开放
troyXyz 2012-12-03
  • 打赏
  • 举报
回复
asp.net 的权限本来就不允许的。 当然,如果你愿意或者真的有理由让web去控制服务器,据说在web.config中加入 <identity impersonate="true" userName="Administrator" password="管理员密码" /> 本人亲测
josxhn 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:
引用 8 楼 的回复:
引用 6 楼 csdm_net 的回复:

获取的句柄都不判断是否有效就用,你不找死吗。


我跟踪断点能看到

IntPtr t = new IntPtr(xlApp.Hwnd);
int k = 0;
//get the id(k) of process by hwnd(t)
GetWindowThreadProces……
[/Quote]

至今未解决。。。抱歉
MyCS012345 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 8 楼 的回复:
引用 6 楼 csdm_net 的回复:

获取的句柄都不判断是否有效就用,你不找死吗。


我跟踪断点能看到

IntPtr t = new IntPtr(xlApp.Hwnd);
int k = 0;
//get the id(k) of process by hwnd(t)
GetWindowThreadProcessId(t, out k);
……
[/Quote]

仰望星空,请问你的问题是否解决了,按照ID,kill 进程的权限问题,谢谢
MyCS012345 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 6 楼 csdm_net 的回复:

获取的句柄都不判断是否有效就用,你不找死吗。


我跟踪断点能看到

IntPtr t = new IntPtr(xlApp.Hwnd);
int k = 0;
//get the id(k) of process by hwnd(t)
GetWindowThreadProcessId(t, out k);

这样……
[/Quote]

我使用了5楼的方法,也一样是出现 拒绝访问的权限,哪位高手可以帮忙?谢谢
josxhn 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 csdm_net 的回复:]

获取的句柄都不判断是否有效就用,你不找死吗。
[/Quote]

我跟踪断点能看到

IntPtr t = new IntPtr(xlApp.Hwnd);
int k = 0;
//get the id(k) of process by hwnd(t)
GetWindowThreadProcessId(t, out k);

这样获取到的 Id 即 k 和 我要关闭的进程Id是一致的
问题就处在 k 和 t 这两个变量拒绝访问。
我很郁闷。

虽然按5楼的方法可以关掉进程了,但其实是根据进程名来关闭的,这种做法很不好,万一有多个excel进程就会一块关闭了
josxhn 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 csdm_net 的回复:]

获取的句柄都不判断是否有效就用,你不找死吗。
[/Quote]

怎么判断啊
csdm_net 2011-05-20
  • 打赏
  • 举报
回复
获取的句柄都不判断是否有效就用,你不找死吗。
artoriar 2011-05-20
  • 打赏
  • 举报
回复
你的权限设置都没有问题,问题在代码里面,从Id获取的进程对象权限很低,具体机制我也不是很清楚,但你需要换一种方式获得进程,再根据Id来判断,这样进程对象权限比较高,从而可以删除


public void KillExcelProcess2(string fileName)
{
Process[] procList = Process.GetProcesses();
IntPtr t = new IntPtr(xlApp.Hwnd);
int k = 0;
//get the id(k) of process by hwnd(t)
GetWindowThreadProcessId(t, out k);

foreach (Process proc in procList)
{
if (k == proc.Id)
proc.Kill();
}
}

josxhn 2011-05-19
  • 打赏
  • 举报
回复
又试了一晚上,还是不行
josxhn 2011-05-19
  • 打赏
  • 举报
回复
救命啊……………………………………………………
josxhn 2011-05-18
  • 打赏
  • 举报
回复

以下是我试过但无效的解决方案:

解决方案1.2.3.4

我应该怪自己没高亮吗?
laowang134 2011-05-18
  • 打赏
  • 举报
回复
解决了?~想表达什么?

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧