c#编写的服务中访问网络位置的共享文件夹

使用LocalSystem运行的服务不能访问共享文件夹,即使共享文件夹权限是对“EveryOne”可读写也不行,目前使用过两种方式,但都需要设置用户密码。

1、使用用户名加密码的方式运行服务。

将 ProjectInstaller 的 Account设置为User

然后打开 ProjectInstaller 的设计器代码

在 InitializeComponent 中设置 ProjectInstaller的Username和Password。运行服务时会直接以设置的用户名运行,可以直接访问该用户名可访问的所有位置。

2、通过API模拟用户登录,感觉比较灵活,可以在服务中随时切换到不同用户权限,服务的运行权限为LocalSystem。

public static class LogonNet
    {
        const int LOGON32_LOGON_INTERACTIVE = 2;
        const int LOGON32_LOGON_NETWORK = 3;
        const int LOGON32_LOGON_NEW_CREDENTIALS = 9;

        const int LOGON32_PROVIDER_DEFAULT = 0;
        const int LOGON32_PROVIDER_WINNT50 = 3;
        const int LOGON32_PROVIDER_WINNT40 = 2;
        const int LOGON32_PROVIDER_WINNT35 = 1;

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int LogonUser(String lpszUserName,
            String lpszDomain,
            String lpszPassword,
            int dwLogonType,
            int dwLogonProvider,
            ref IntPtr phToken);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int DuplicateToken(IntPtr hToken,
            int impersonationLevel,
            ref IntPtr hNewToken);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool RevertToSelf();

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool CloseHandle(IntPtr handle);

        private static WindowsImpersonationContext impersonationContext;

        public static bool impersonateValidUser(String userName, String domain, String password)
        {
            WindowsIdentity tempWindowsIdentity;
            IntPtr token = IntPtr.Zero;
            IntPtr tokenDuplicate = IntPtr.Zero;

            if (RevertToSelf())
            {
                if (LogonUser(userName, domain, password, LOGON32_LOGON_NEW_CREDENTIALS,
                    LOGON32_PROVIDER_DEFAULT, ref token) != 0)
                {
                    if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                    {
                        tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                        impersonationContext = tempWindowsIdentity.Impersonate();
                        if (impersonationContext != null)
                        {
                            System.AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
                            IPrincipal pr = System.Threading.Thread.CurrentPrincipal;
                            IIdentity id = pr.Identity;
                            CloseHandle(token);
                            CloseHandle(tokenDuplicate);
                            return true;
                        }
                    }
                }
            }

            if (token != IntPtr.Zero)
                CloseHandle(token);

            if (tokenDuplicate != IntPtr.Zero)
                CloseHandle(tokenDuplicate);

            return false;
        }
        public static void undoImpersonation()
        {
            impersonationContext.Undo();
        }
    }

调用方式

private void test()
        {
            if (LogonNet.impersonateValidUser("userTest", "Users", "userPassword"))
            {
                using (StreamWriter writer=new StreamWriter("\\192.168.1.13\\ShareTest\\test.txt"))
                {
                    writer.WriteLine("模拟登录访问网络共享文件成功");
                }
            }
        }

感觉第二种方式更灵活一点,先这样用了

原文地址:https://www.cnblogs.com/Elvis-Luo/p/11674635.html

时间: 2024-08-04 00:20:33

c#编写的服务中访问网络位置的共享文件夹的相关文章

错误代码:0x800704cf 不能访问网络位置(win7 访问不了局域网电脑) .

今天,我们同事请求网络部援助,说是无法访问共享文件夹.然后,让我过去帮助处理一下.访问很慢,然后报错,弹出如下对话框: 1.刚开始,我以为是samba服务出现问题,然后我通过其他局域网内的电脑访问,发现是完全正常的. 2.然后,我通过ping命令,测试一下连接性,发现也是可以正常ping通的,尼玛,我感觉有点玄乎了. 3.然后,禁用.启用网卡,然后在访问共享文件夹, 问题依旧. 4.难道是网卡的问题? 重新安装网卡驱动之后,还是这样的问题. 5.非要重新安装系统(⊙_⊙)?有事没事儿的重装系统,

计算机加入域 不能访问网络位置 解决办法

计算机加入域 不能访问网络位置 解决办法 启动以下服务

.Net版SQLite无法访问网络位置的数据库文件-winOpen,os_win.c 36702异常

最近一个C#小程序,希望将SQLite数据库放在网络共享的位置,让多个客户端同时访问.却发现SQLite连接不上该网络位置的数据库,而如果数据库在本地则一切正常. 例如将SQLite数据库 test.dat 放在共享位置:\\System\Data\test.dat, 通过SQLite创建数据库连接,执行Open时,将抛掷异常: SQLite error (14): os_win.c:36702: (3) winOpen(D:\System\Data\test.dat) - 系统找不到指定的路径

解决Windows服务无法访问网络映射盘的问题

下载工具psexec 下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec 百度地址:https://pan.baidu.com/s/1Yw5fQpsxe2Tdh94R-A_2ug       提取码:y5ik 用psexec创建网络驱动器 1.运行CMD,执行 psexec -i -s cmd.exe 2.在新开的CMD窗口中运行网络映射 net use z: \\10.10.x.xxx\test /persis

Android中访问网络时url中带有特殊字符的问题

Component Example value Also known as Protocol http scheme Authority username:[email protected]:8080   User Info username:password   Host host   Port 8080   File /directory/file?query   Path /directory/file   Query query   Ref ref fragment 一个完整的url链接

服务中访问当前用户注册表信息

Windows Vista后有session 0隔离机制,那么在服务中是不能直接访问当前登录用户的注册表信息的,因为此时的HKEY_CURRENT_USER是里面是system的.那么实在需要,该怎么做呢?方法还是有的,在网上搜了一下,如下两个链接提供了一些方法: http://blog.csdn.net/zwh37333/article/details/6358725 http://blog.csdn.net/ly402609921/article/details/9127959 但是很不幸,

登录网络上的共享文件夹命令net use备忘

在cmd运行中输入 net use Z: \\server\C$ "PASSWORD" /user:"USERNAME" 或net use \\10.1.40.22\ipc$ "1" /user:administrator 也可以 \\10.0.0.1\目录 具体命令帮助如下: 也可以自己运行 cmd 后输入 net help use 经常需要访问局域网内其他机子上的共享文件夹,例如\\192.168.1.1\d$ , 首次访问时,需要输入用户名

nat下没法ping通virutalbox中的centos7,解决共享文件夹问题

1. 先解决网络问题 参考这篇:https://www.jianshu.com/p/e6ba699b5992 vi /etc/sysconfig/network-scrips/ifcfg-eth0, 添加如下内容 DEVICE=eth0 HWADDR=08:00:27:6D:2A:D0 ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=dhcp 主机和虚拟机之间的网络配置(Host-only) 在VirtualBox中添加宿主机器网卡 关闭虚拟机,并在虚拟机的设置中启

VMware Workstation中linux(centos)与windows7共享文件夹

引用网站有: http://www.jb51.net/LINUXjishu/161994.html http://www.cnblogs.com/xiehy/archive/2011/12/19/2293599.html 功能相当于是用 虚拟机的环境作运行,相当于在 linux下开发(条件是宿主计算机不能太差) 安装 vmware安装 tool1.虚拟机->安装vm tools(重新安装) 2.打开VMware->工具栏—>虚拟机—>可移动设备—>CD-ROM—>设置—