问题描述
此问题违反C#版关于标题的规定,问题移到非技术区,提问者禁言10天。此问题提问者见到此信息后可以根据C#版置顶公告提示举报其他违规者提前解除禁言。版主:老实说这个禁言只是象征性的,因为这个问题除了标题之外其他的部分到也没什么问题。我想大家都能理解LZ的心情,但是LZ,就算这个论坛充斥着一大堆低级问题,你可以对你的问题作出评价,界定范围,但是在标题中说明问题是你作为提问者的义务。我们在web服务器(iis)上部署了webservice,它所实现的功能是远程关闭计算机,当我在服务器上通过.net2005调试该webservice时可以正常关闭计算机,可是无论我在客户端还是在服务器本身直接访问该webservice时,均无法实现正常关机。我通过vs2005直接调试iis上的该webservice代码全部是按照正确的方式执行,可是结果却是不能关机。。。关机代码类文件如下所示:引用:usingSystem.Runtime.InteropServices;///<summary>///shutdown_pc的摘要说明///</summary>publicclassshutdown_pc{[StructLayout(LayoutKind.Sequential,Pack=1)]privatestructTokPriv1Luid{publicintCount;publiclongLuid;publicintAttr;}[DllImport("kernel32.dll",ExactSpelling=true)]//GetCurrentProcess函数返回当前进程的一个句柄privatestaticexternIntPtrGetCurrentProcess();[DllImport("advapi32.dll",ExactSpelling=true,SetLastError=true)]//OpenProcessToken函数打开一个进程的访问代号privatestaticexternboolOpenProcessToken(IntPtrProcessHandles,intDesiredAccess,refIntPtrTokenHandle);[DllImport("advapi32.dll",SetLastError=true)]//LookupPrivilegeValue函数获得本地唯一的标示符(LUID),用于在特定的系统中//表示特定的优先权。privatestaticexternboolLookupPrivilegeValue(stringlpSystemName,stringlpName,reflonglpLuid);//AdjustTokenPrivileges函数允许或者禁用指定访问记号的优先权。//允许或者禁用优先权需要TOKEN_ADJUST_PRIVILEGES访问权限。[DllImport("advapi32.dll",ExactSpelling=true,SetLastError=true)]privatestaticexternboolAdjustTokenPrivileges(IntPtrTokenHandle,boolDisableAllPrivileges,refTokPriv1LuidNewState,intBufferLength,IntPtrPreviousState,IntPtrReturnLength);//ExitWindowsEx函数可以注销,关机或者重新启动系统[DllImport("user32.dll",ExactSpelling=true,SetLastError=true)]privatestaticexternboolExitWindowsEx(intflg,intrea);privateconstintSE_PRIVILEGE_ENABLED=0x00000002;privateconstintTOKEN_QUERY=0x00000008;privateconstintTOKEN_ADJUST_PRIVILEGES=0x00000020;privateconststringSE_SHUTDOWN_NAME="SeShutdownPrivilege";privateconstintEWX_LOGOFF=0x00000000;//注销privateconstintEWX_SHUTDOWN=0x00000001;//关机privateconstintEWX_REBOOT=0x00000002;//重启privateconstintEWX_FORCE=0x00000004;privatestaticvoidRebootCommand(intflg){boolok;TokPriv1Luidtp;IntPtrhproc=GetCurrentProcess();//得到当前的进程IntPtrhtok=IntPtr.Zero;ok=OpenProcessToken(hproc,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,refhtok);tp.Count=1;tp.Luid=0;tp.Attr=SE_PRIVILEGE_ENABLED;ok=LookupPrivilegeValue(null,SE_SHUTDOWN_NAME,reftp.Luid);ok=AdjustTokenPrivileges(htok,false,reftp,0,IntPtr.Zero,IntPtr.Zero);ok=ExitWindowsEx(flg,0);}///<summary>///关闭计算机///</summary>publicstaticvoidCloseComputer(){RebootCommand(EWX_SHUTDOWN+EWX_FORCE);}///<summary>///注销计算机///</summary>publicstaticvoidLogOutComputer(){RebootCommand(EWX_LOGOFF+EWX_FORCE);}///<summary>///重启计算机///</summary>publicstaticvoidReStartComputer(){RebootCommand(EWX_REBOOT+EWX_FORCE);}///<summary>///获得系统已运行的时间,返回秒数///</summary>///<returns>返回秒数</returns>publicstaticintGetRunSecondTime(){inttime=Environment.TickCount/1000;returntime;}}webservise代码如下:///<summary>///2.4.3关闭计算机接口///</summary>[WebMethod]publicstringshutdown_computer(){shutdown_pc.CloseComputer();return"ok";}首先是调用webservices接口,执行时接口再调以上类文件关机的方法
解决方案
本帖最后由 Ivony 于 2008-04-18 21:05:16 编辑
解决方案二:
用winserviceweb操作不了
解决方案三:
友情UP
解决方案四:
不是WEBSERVICES操作不了的问题啊我在。NET环境下也是调的WEB就可以正常关机的啊
解决方案五:
...iis对win系统操作有很大限制,就是防止你种HK行为,就算通过web删除个文件还得要权限呢.winservice就不会这种限制总之就是权限如果你能把web行为模拟为administrator这种用户角色的话就可以执行
解决方案六:
不是大师级...飘过
解决方案七:
你的IIS用什么帐号运行呢?先确定是否它的权限不足.
解决方案八:
权限问题,如果你设置IIS访问时使用Administrator权限的话,保证你能关机,呵
解决方案九:
引用7楼boblaw的回复:
权限问题,如果你设置IIS访问时使用Administrator权限的话,保证你能关机,呵
解决方案十:
windows权限问题只做过winfrom的`
解决方案十一:
支持一下。
解决方案十二:
处男路过.....
解决方案十三:
飘过.........................