模拟用户登录访问共享(或者懂共享文件夹原理)——使用过WindowsImpersonationContext类,LogOnUser方法的请进

问题描述

我使用类WindowsImpersonationContext。来模拟用户登录访问共享,但是用完后共享资源得不到及时释放,会出现会话空闲状态,不知道如何释放掉使用的示例是:我的代码如下:[DllImport("advapi32.dll",SetLastError=true)]privatestaticexternboolLogonUser(stringlpszUsername,stringlpszDomain,stringlpszPassword,intdwLogonType,intdwLogonProvider,refIntPtrphToken);[DllImport("kernel32.dll",CharSet=CharSet.Auto)]privateunsafestaticexternintFormatMessage(intdwFlags,refIntPtrlpSource,intdwMessageId,intdwLanguageId,refStringlpBuffer,intnSize,IntPtr*arguments);[DllImport("kernel32.dll",CharSet=CharSet.Auto,SetLastError=true)]privatestaticexternboolCloseHandle(IntPtrhandle);[DllImport("advapi32.dll",CharSet=CharSet.Auto,SetLastError=true)]publicexternstaticboolDuplicateToken(IntPtrexistingTokenHandle,intSECURITY_IMPERSONATION_LEVEL,refIntPtrduplicateTokenHandle);//logontypesconstintLOGON32_LOGON_INTERACTIVE=2;constintLOGON32_LOGON_NETWORK=3;constintLOGON32_LOGON_NEW_CREDENTIALS=9;//logonprovidersconstintLOGON32_PROVIDER_DEFAULT=0;constintLOGON32_PROVIDER_WINNT50=3;constintLOGON32_PROVIDER_WINNT40=2;constintLOGON32_PROVIDER_WINNT35=1;stringDomainName,User,Pass;publicShareAccess2(stringdomainname,stringuser,stringpass){DomainName=domainname;User=user;Pass=pass;}publicvoiddoworkinshare(stringsharefolder){IntPtrtoken=IntPtr.Zero;IntPtrdupToken=IntPtr.Zero;boolisSuccess=LogonUser(User,DomainName,Pass,LOGON32_LOGON_NEW_CREDENTIALS,LOGON32_PROVIDER_DEFAULT,reftoken);if(!isSuccess){RaiseLastError();}isSuccess=DuplicateToken(token,2,refdupToken);if(!isSuccess){RaiseLastError();}FileInfo[]files=null;using(WindowsIdentitynewIdentity=newWindowsIdentity(dupToken)){using(WindowsImpersonationContextwincontext=newIdentity.Impersonate()){//TODO:dosomethingDirectoryInfodirInfo=newDirectoryInfo(sharefolder);files=dirInfo.GetFiles();}}foreach(FileInfofileinfiles){Console.WriteLine(file.FullName);}isSuccess=CloseHandle(token);if(!isSuccess){RaiseLastError();}}//GetErrorMessageformatsandreturnsanerrormessage//correspondingtotheinputerrorCode.publicunsafestaticstringGetErrorMessage(interrorCode){intFORMAT_MESSAGE_ALLOCATE_BUFFER=0x00000100;intFORMAT_MESSAGE_IGNORE_INSERTS=0x00000200;intFORMAT_MESSAGE_FROM_SYSTEM=0x00001000;intmessageSize=255;stringlpMsgBuf="";intdwFlags=FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS;IntPtrptrlpSource=IntPtr.Zero;IntPtrptrArguments=IntPtr.Zero;intretVal=FormatMessage(dwFlags,refptrlpSource,errorCode,0,reflpMsgBuf,messageSize,&ptrArguments);if(retVal==0){thrownewApplicationException(string.Format("Failedtoformatmessageforerrorcode'{0}'.",errorCode));}returnlpMsgBuf;}privatestaticvoidRaiseLastError(){interrorCode=Marshal.GetLastWin32Error();stringerrorMessage=GetErrorMessage(errorCode);thrownewApplicationException(errorMessage);}}

然后我循环调用该方法(每次用完应该是释放掉了资源,但是实际上会话还会保留几秒,不过那时候共享访问处于空闲状态,之后才会被释放。。。应该是系统自动释放的),到底应该如何释放掉共资源呢?

解决方案

解决方案二:
快帮忙啊
解决方案三:
该回复于2012-03-20 08:50:23被版主删除
解决方案四:
访问完共享资源后,用impersonationContext.Undo();返回原来的用户,即:DirectoryInfodirInfo=newDirectoryInfo(sharefolder);files=dirInfo.GetFiles();wincontext.Undo();
解决方案五:
非常感谢你的回答,但是问题依旧是那样啊,当我循环调用doworkinshare方法(我上面的代码)时,在vista或win7系统的共享中会出现多个用户访问的情况(原因应该是释放会话的时间太长,感觉像是系统在异步处理会话)并且处于空闲状态结果是这样的:[img=http://social.msdn.microsoft.com/Forums/getfile/81565][/img]在xp系统或者win2003里面就会只有一个会话,但是,我在循环里面加上sleep,会导致共享的会话处于空闲状态(如下,会话会间断地出现空闲5秒的情况)main方法:while(true){ShareAccess2share=newShareAccess2("192.168.1.189","XPMUser","123456");share.doworkinshare(@"\192.168.1.189dataMachine70");Thread.Sleep(5000);}

能不能再帮忙看一下如何做啊,我的目的是用完了立即释放掉,尽量少占用共享的连接数,如果代码不好搞的话系统可不可以设置成一旦连接处于空闲状态,立即给他断开?

时间: 2024-10-11 03:21:18

模拟用户登录访问共享(或者懂共享文件夹原理)——使用过WindowsImpersonationContext类,LogOnUser方法的请进的相关文章

Windows server 2008文件服务器之一隐藏用户无权限访问的共享文件夹

话说在windows server 2003 SP1可以从微软获得一个插件得到这样一个实用的功能:让用户没有权限访问的共享文件夹隐身,这样保证了一定程度上资讯安全解决文件服务器的共享文件繁多让用户浪费时间寻找属于自己的文件夹的苦恼.墨迹太多,呵呵忘记说了,这个插件就是ABE插件,但是是英文的, 自从CC将公司的文件服务器升级到2008后一直想着办法提升文件服务器的管理功能,但是ABE插件好像自从2003后一直未有升级版本,导致CC以为微软是不是抛弃了这个功能,最后经过多方查找后终于找到这个功能,

php-PHP模拟用户登录模块设计

问题描述 PHP模拟用户登录模块设计 初学者,遇到下面问题,求帮助! 1.模拟用户登录模块,具体要求如下: (1).创建一个用户登录的表单页面. (2).对用户输入的信息进行二次验证,即在客户端进行输入格式验证(如用户名不能为空,密码至少6位等),在服务器端进行用户名和密码的匹配验证(可以假设一个用户名和密码). (3)根据不同的验证结果给用户合理的反馈. 解决方案 这是个问题么.... 解决方案二: 不明白问题是什么..

请问写python爬虫如何用urllib或者requests模拟用户登录

问题描述 请问写python爬虫如何用urllib或者requests模拟用户登录 比如我在百度文库下个课件,http://youke.baidu.com/view/05984a27b4daa58da0114ac6, 我用urllib2或者request,我可以用urllib2.open(url)或者requests.get(url)来打开页面,但是不知道如何写cookie的,就是让浏览器认为你已经登录了,请问如何写urllib或者requests.get呢?谢谢 解决方案 可以参考下,过程都关

c#模拟用户登录,如何实现,有没有人给我个具体的例子啊???

问题描述 c#模拟用户登录,如何实现,有没有人给我个具体的例子啊???我是想抓取西祠网中论坛中的数据的,可是只能抓取论坛的前10页内容,其他抓不了.于是就得模拟用户登录才行.我都搞一周了.还是没弄出来,网上倒是有很多,可是都不完整.我不知从何用起,从何改起啊.请高手们指教.如果有其他网站的正确的例子,发我一下也好.我自己研究也行.要能出来的. 解决方案 解决方案二:该回复于2011-11-23 16:45:46被版主删除

php curl_setopt与模拟用户登录

php教程 curl_setopt与模拟用户登录 bool curl_setopt (int ch, string option, mixed value) curl_setopt()函数将为一个curl会话设置选项.option参数是你想要的设置, value是这个选项给定的值. //该例子为模拟登录   $cookie_file = tempnam('./temp','cookie');//保存临时cookie   $login_url = 'http://xxx/login.php';//

Win8局域网无法访问共享文件夹如何解决

  在这个网络时代里面,我们的生活和工作都很难离开它,但难免局域网会出现有一些问题.最近,Win8系统的用户就遇到这样的情况,通过局域网访问朋友的共享文件时,出现无法访问共享文件夹.怎么办?那下面就和大家介绍一下如何解决Win8局域网无法访问共享文件夹的问题. 解决方法如下: 方法一 1.打开网络共享中心 打开Win8的控制面板,点击右上角的按大图标排列,找到网络共享中心,打开. 2.打开"更改高级共享设置" 在网络共享中心的这个界面,你会看到左侧栏有一个"更改高级共享设置&

Android+struts2+json方式模拟手机登录功能

涉及到的知识点:  1.Struts2框架的搭建(包括Struts2的jSON插件)   2.Android前台访问Web采用HttpClient方式.   3.Android采用JSON的解析. 服务端主要包含一个Action,通过struts的web配置配置struts.xml驱动业务逻辑的执行,然后对于符合条件的登录,返回给客户端通过jsonobject包装的数据. 服务端代码: package com.easyway.json.android;      import java.util

如果您想确保Windows 10在新用户登录时不安装内置应用程序,则必须删除所有配置的应用程序。

原文 如果您想确保Windows 10在新用户登录时不安装内置应用程序,则必须删除所有配置的应用程序. 本文的内容 已安装与配置的应用程序 删除配置的应用程序 安装与配置的应用程序^ 在介绍如何删除所有内置应用程序之前,我必须解释安装和配置的应用程序之间的区别.这种差异仅适用于Microsoft现在称为Windows应用程序的新的触摸优化应用程序. 您可能已经注意到,每当用户首次在Windows 10计算机上登录时,Windows将开始安装该特定用户的应用程序.这些应用程序是配置的应用程序.同样

java中使用Filter控制用户登录权限具体实例_java

学jsp这么长时间,做的项目也有七八个了,可所有的项目都是用户登录就直接跳转到其拥有权限的页面,或者显示可访问页面的链接.使用这种方式来幼稚地控制访问权限.从来没有想过如果我没有登录,直接输入地址也可以直接访问用户的页面的. 在jsp中权限的控制是通过Filter过滤器来实现的,所有的开发框架中都集成有Filter,如果不适用开发框架则有如下实现方法: LoginFilter.java 复制代码 代码如下: public class LoginFilter implements Filter {