Наша компания имеет сервер точку документа, где доля UNC выглядит примерно так: \\ theserver.ourdomain.com \ RootDirectoryДоступ к файлам на сервере Указав мандатной
В настоящее время этот диск отображается в Z: \ на мой локальный компьютер. Для доступа к Z: \ вам необходимо указать (каждый раз, когда вы входите в систему) учетные данные (в нашем случае это наше имя пользователя и пароль, с которыми мы вошли) для доступа к папкам и файлам в корневом каталоге .
Я в ситуации, когда мне нужно скопировать файлы на сервер точек доступа. Я хочу, чтобы иметь возможность копировать файлы на сервер без использования подключенного сетевого диска (не нужно указывать Z: \ в пути). Как я могу предоставить учетные данные, чтобы я мог выполнять основные функции ввода-вывода, такие как GetDirectories(), GetFiles(), IO.File.Copy() и т. Д. ...?
Я посмотрел на следующие вещи, но не удалось сделать их работу:
- LogonUser API вызов, указав обычный текст имя пользователя и пароль, а затем принимает маркер от этого вызова и выдает себя, что пользователь с помощью новый экземпляр класса WindowsIdentity. Был способен получить токен, но олицетворение, похоже, не сработало. Уязвимость в доступе запрещена.
CredUIPromptForCredentials/CredUIPromptForWindowsCredentials API-вызовы API, но я понимаю, что это просто фантастический пользовательский интерфейс Windows, где вы можете ввести свои учетные данные и фактически ничего не делать.
<DllImport("advapi32.dll", SetLastError:=True)> _ Private Shared Function LogonUser(lpszUsername As String, lpszDomain As String, _ lpszPassword As String, dwLogonType As Integer, _ dwLogonProvider As Integer, ByRef phToken As IntPtr) As Boolean End Function <DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _ Private Shared Function CloseHandle(handle As IntPtr) As Boolean End Function '// logon types Public Const LOGON32_LOGON_NETWORK As Integer = 3 Public Const LOGON32_LOGON_NEW_CREDENTIALS As Integer = 9 '// logon providers Public Const LOGON32_PROVIDER_WINNT50 As Integer = 3 Public Const LOGON32_PROVIDER_WINNT40 As Integer = 2 Public Const LOGON32_PROVIDER_WINNT35 As Integer = 1 Public Const LOGON32_PROVIDER_DEFAULT As Integer = 0 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim token = IntPtr.Zero Dim success = LogonUser("username", "domain", "password", _ LOGON32_LOGON_NEW_CREDENTIALS, _ LOGON32_PROVIDER_DEFAULT, token) If Not success Then Me.RaiseLastWin32Error() End If Using identity = New WindowsIdentity(token) Using impersonated = identity.Impersonate() Try Dim info = New DirectoryInfo("\\theserver.ourdomain.com\rootdirectory\") Dim files = info.GetDirectories() Catch ex As Exception Finally impersonated.Undo() End Try If Not CloseHandle(token) Then Me.RaiseLastWin32Error() End If End Using End Using End Sub Private Sub RaiseLastWin32Error() Dim hr = Marshal.GetLastWin32Error() Dim ex = Marshal.GetExceptionForHR(hr) If ex IsNot Nothing Then Throw ex End If Throw New SystemException(String.Format("Call resulted in error code {0}", hr)) End Sub
Возможный дубликат [Переместить файл на сетевой ресурс (через олицетворение) C#] (http://stackoverflow.com/questions/5960937/move-file-onto-network-share-via-impersonation-c-sharp) –
Дополнительный ресурс MSDN: http://msdn.microsoft.com/en-us/library/chf6fbt4.aspx. Понимая, что вы уже пробовали это (# 1 в своем сообщении), вам может потребоваться фактически показать код, чтобы диагностировать, почему вы получаете исключения. –
Добавлен код для сообщения выше – test