Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.ComponentModel.Win32Exception(0x80004005):找不到网络名称_C#_File Io_Windows Services_Impersonation - Fatal编程技术网

C# System.ComponentModel.Win32Exception(0x80004005):找不到网络名称

C# System.ComponentModel.Win32Exception(0x80004005):找不到网络名称,c#,file-io,windows-services,impersonation,C#,File Io,Windows Services,Impersonation,我从堆栈溢出复制了以下类 /// <inheritdoc /> /// <summary> /// Provides access to a network share. /// </summary> public class NetworkShareAccesser : IDisposable { private string _remoteUncName; private string _remoteComputerName;

我从堆栈溢出复制了以下类

 /// <inheritdoc />
/// <summary>
/// Provides access to a network share.
/// </summary>
public class NetworkShareAccesser : IDisposable
{
    private string _remoteUncName;
    private string _remoteComputerName;

    public string RemoteComputerName
    {
        get { return _remoteComputerName; }
        set
        {
            _remoteComputerName = value;
            _remoteUncName = @"\\" + _remoteComputerName;
        }
    }

    public string UserName
    {
        get;
        set;
    }

    public string Password
    {
        get;
        set;
    }

    #region Consts

    private const int RESOURCE_CONNECTED = 0x00000001;
    private const int RESOURCE_GLOBALNET = 0x00000002;
    private const int RESOURCE_REMEMBERED = 0x00000003;

    private const int RESOURCETYPE_ANY = 0x00000000;
    private const int RESOURCETYPE_DISK = 0x00000001;
    private const int RESOURCETYPE_PRINT = 0x00000002;

    private const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000;
    private const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001;
    private const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002;
    private const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003;
    private const int RESOURCEDISPLAYTYPE_FILE = 0x00000004;
    private const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005;

    private const int RESOURCEUSAGE_CONNECTABLE = 0x00000001;
    private const int RESOURCEUSAGE_CONTAINER = 0x00000002;

    private const int CONNECT_INTERACTIVE = 0x00000008;
    private const int CONNECT_PROMPT = 0x00000010;
    private const int CONNECT_REDIRECT = 0x00000080;
    private const int CONNECT_UPDATE_PROFILE = 0x00000001;
    private const int CONNECT_COMMANDLINE = 0x00000800;
    private const int CONNECT_CMD_SAVECRED = 0x00001000;

    private const int CONNECT_LOCALDRIVE = 0x00000100;

    #endregion Consts

    #region Errors

    private const int NO_ERROR = 0;
    private const int ERROR_ACCESS_DENIED = 5;
    private const int ERROR_ALREADY_ASSIGNED = 85;
    private const int ERROR_BAD_DEVICE = 1200;
    private const int ERROR_BAD_NET_NAME = 67;
    private const int ERROR_BAD_PROVIDER = 1204;
    private const int ERROR_CANCELLED = 1223;
    private const int ERROR_EXTENDED_ERROR = 1208;
    private const int ERROR_INVALID_ADDRESS = 487;
    private const int ERROR_INVALID_PARAMETER = 87;
    private const int ERROR_INVALID_PASSWORD = 1216;
    private const int ERROR_MORE_DATA = 234;
    private const int ERROR_NO_MORE_ITEMS = 259;
    private const int ERROR_NO_NET_OR_BAD_PATH = 1203;
    private const int ERROR_SESSION_CREDENTIAL_CONFLICT = 1219;
    private const int ERROR_NO_NETWORK = 1222;

    private const int ERROR_BAD_PROFILE = 1206;
    private const int ERROR_CANNOT_OPEN_PROFILE = 1205;
    private const int ERROR_DEVICE_IN_USE = 2404;
    private const int ERROR_NOT_CONNECTED = 2250;
    private const int ERROR_OPEN_FILES = 2401;

    #endregion Errors

    #region PInvoke Signatures

    [DllImport("Mpr.dll")]
    private static extern int WNetUseConnection(
        IntPtr hwndOwner,
        NETRESOURCE lpNetResource,
        string lpPassword,
        string lpUserID,
        int dwFlags,
        string lpAccessName,
        string lpBufferSize,
        string lpResult
        );

    [DllImport("Mpr.dll")]
    private static extern int WNetCancelConnection2(
        string lpName,
        int dwFlags,
        bool fForce
        );

    [StructLayout(LayoutKind.Sequential)]
    private class NETRESOURCE
    {
        public int dwScope = 0;
        public int dwType = 0;
        public int dwDisplayType = 0;
        public int dwUsage = 0;

        [MarshalAs(UnmanagedType.LPWStr)]
        public string lpLocalName;

        [MarshalAs(UnmanagedType.LPWStr)]
        public string lpRemoteName;

        [MarshalAs(UnmanagedType.LPWStr)]
        public string lpComment;

        [MarshalAs(UnmanagedType.LPWStr)]
        public string lpProvider;
    }

    #endregion PInvoke Signatures

    /// <summary>
    /// Creates a NetworkShareAccesser for the given computer name. The user will be prompted to enter credentials
    /// </summary>
    /// <param name="remoteComputerName"></param>
    /// <returns></returns>
    public static NetworkShareAccesser Access(string remoteComputerName)
    {
        return new NetworkShareAccesser(remoteComputerName);
    }

    /// <summary>
    /// Creates a NetworkShareAccesser for the given computer name using the given domain/computer name, user name and password
    /// </summary>
    /// <param name="remoteComputerName"></param>
    /// <param name="domainOrComuterName"></param>
    /// <param name="userName"></param>
    /// <param name="password"></param>
    public static NetworkShareAccesser Access(string remoteComputerName, string domainOrComuterName, string userName, string password)
    {
        return new NetworkShareAccesser(remoteComputerName,
                                        domainOrComuterName + @"\" + userName,
                                        password);
    }

    /// <summary>
    /// Creates a NetworkShareAccesser for the given computer name using the given user name (format: domainOrComputername\User name) and password
    /// </summary>
    /// <param name="remoteComputerName"></param>
    /// <param name="userName"></param>
    /// <param name="password"></param>
    public static NetworkShareAccesser Access(string remoteComputerName, string userName, string password)
    {
        return new NetworkShareAccesser(remoteComputerName,
                                        userName,
                                        password);
    }

    private NetworkShareAccesser(string remoteComputerName)
    {
        RemoteComputerName = remoteComputerName;

        ConnectToShare(_remoteUncName, null, null, true);
    }

    private NetworkShareAccesser(string remoteComputerName, string userName, string password)
    {
        RemoteComputerName = remoteComputerName;
        UserName = userName;
        Password = password;

        ConnectToShare(_remoteUncName, UserName, Password, false);
    }

    private static void ConnectToShare(string remoteUnc, string username, string password, bool promptUser)
    {
        Logger.LogInformationWithNoQueue($"Remote Computer: {remoteUnc}, User Name: {username}, Password: {password}");
        NETRESOURCE nr = new NETRESOURCE
        {
            dwType = RESOURCETYPE_DISK,
            lpRemoteName = remoteUnc
        };

        var result = promptUser
            ? WNetUseConnection(IntPtr.Zero, nr, "", "", CONNECT_INTERACTIVE | CONNECT_PROMPT, null, null, null)
            : WNetUseConnection(IntPtr.Zero, nr, password, username, 0, null, null, null);

        if (result != NO_ERROR)
        {
            throw new Win32Exception(result);
        }
    }

    public static void DisconnectFromShare(string remoteUnc)
    {
        int result = WNetCancelConnection2(remoteUnc, CONNECT_UPDATE_PROFILE, false);
        if (result != NO_ERROR)
        {
            throw new Win32Exception(result);
        }
    }

    /// <inheritdoc />
    /// <summary>
    /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
    /// </summary>
    /// <filterpriority>2</filterpriority>
    public void Dispose()
    {
        DisconnectFromShare(_remoteUncName);
    }
}
我的windows服务正在本地服务帐户下运行。我也尝试了本地帐户,但没有成功

我的电话如下

 using (NetworkShareAccesser.Access(_sharedDriveSettingsConfig.RemoteComputerName, _sharedDriveSettingsConfig.UserName, _sharedDriveSettingsConfig.Password))
 {
   File.Copy(orignalImage, Path.Combine(sharedPathFolderName, newFileName), true);
 }

我的共享驱动器不在域上。因此,我只能使用它的名称和DNS名称访问它。我们将不胜感激

如果您怀疑进程所有者的权限,那么只需将示例命令行应用程序作为“本地服务”或“本地系统”运行,比如使用计划任务或类似的任务,并查看它对您的工作方式。在进一步阅读代码时,您可以使用用户“a”建立连接(
WNetUseConnection
)(从配置中),然后将连接(
文件.Copy
)用作用户“B”(服务的登录用户)。你为什么希望它能工作。它类似于Jon登录到他的计算机并创建
Z:
驱动器,Nancy创建
cd/d Z:
。为什么会工作?除非服务以与你配置的相同用户的身份运行,否则代码将无法正常工作如果你怀疑进程所有者的权限,那么只需在作为“本地服务”或“本地系统”的示例命令行应用程序中,假设使用计划任务或类似的任务,并查看它对您的工作方式在进一步阅读代码时,您可以使用用户“a”(从配置)建立连接(
WNetUseConnection
),然后将连接(
File.Copy
)用作用户“B”(您服务的登录用户)。为什么您希望它工作。它类似于Jon登录到他的计算机并创建
Z:
驱动器,Nancy创建
cd/d Z:
。为什么工作?除非服务以您配置的同一用户运行,否则代码将无法正常工作
 using (NetworkShareAccesser.Access(_sharedDriveSettingsConfig.RemoteComputerName, _sharedDriveSettingsConfig.UserName, _sharedDriveSettingsConfig.Password))
 {
   File.Copy(orignalImage, Path.Combine(sharedPathFolderName, newFileName), true);
 }