如何按特定用户打开文件

Posted

技术标签:

【中文标题】如何按特定用户打开文件【英文标题】:How to open file by specific user 【发布时间】:2013-02-22 04:39:03 【问题描述】:

如何使用 .Net 打开特定用户的文件。 示例:

File.OpenFile(filePath, user)

【问题讨论】:

请澄清:您要使用特定用户的凭据打开文件吗? .NET 框架中不存在此方法。更具体地说明您想要完成的任务,而不是您想要使用的方法。 我只是想检查用户是否可以打开/读取文件。 (任何用户不仅登录用户) 【参考方案1】:

来自this线程:

const string file = @"\\machine\test\file.txt";

        using (UserImpersonation2 user = new UserImpersonation2("user", "domain", "password"))
        
            if (user.ImpersonateValidUser())
            
                StreamReader reader = new StreamReader(file);
                Console.WriteLine(reader.ReadToEnd());
                reader.Close();
            
        


class UserImpersonation2:IDisposable

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

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

    WindowsImpersonationContext wic;
    IntPtr tokenHandle;
    string _userName;
    string _domain;
    string _passWord;

    public UserImpersonation2(string userName, string domain, string passWord)
    
        _userName = userName;
        _domain = domain;
        _passWord = passWord;
    

    const int LOGON32_PROVIDER_DEFAULT = 0;
    const int LOGON32_LOGON_INTERACTIVE = 2;

    public bool ImpersonateValidUser()
    
        bool returnValue = LogonUser(_userName, _domain, _passWord,
                LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
                ref tokenHandle);

        Console.WriteLine("LogonUser called.");

        if (false == returnValue)
        
            int ret = Marshal.GetLastWin32Error();
            Console.WriteLine("LogonUser failed with error code : 0", ret);
            return false;
        

        Console.WriteLine("Did LogonUser Succeed? " + (returnValue ? "Yes" : "No"));
        Console.WriteLine("Value of Windows NT token: " + tokenHandle);

        // Check the identity.
        Console.WriteLine("Before impersonation: "
            + WindowsIdentity.GetCurrent().Name);
        // Use the token handle returned by LogonUser.
        WindowsIdentity newId = new WindowsIdentity(tokenHandle);
        wic = newId.Impersonate();

        // Check the identity.
        Console.WriteLine("After impersonation: "
            + WindowsIdentity.GetCurrent().Name);
        return true;
    
    #region IDisposable Members
    public void Dispose()
    
        if(wic!=null)
            wic.Undo();
        if (tokenHandle != IntPtr.Zero)
            CloseHandle(tokenHandle);

    
    #endregion

【讨论】:

我习惯使用 advapi32.dll 作为您的建议。但是如果有任何继承的权限,它总是抛出异常。

以上是关于如何按特定用户打开文件的主要内容,如果未能解决你的问题,请参考以下文章

按完整路径打开文件

Linux 中的 lsof 命令使用大全

C# 检查用户输入的特定文件名并打开文件

在 C++ 中按完整路径打开文件

如何打开 CSV 文件并将特定值加一

如何在特定查看器中从内部存储打开文件? [复制]