В нашей компании есть сервер документов точки общего доступа, где UNC выглядит примерно так: \\ theserver.ourdomain.com \ rootdirectory
В настоящее время этот диск сопоставлен с Z: \ на моем локальном компьютере. Для доступа к Z: \ вы должны указывать (каждый раз при входе в систему) учетные данные (в нашем случае это наши имя пользователя и пароль, с которыми мы вошли в систему) для доступа к папкам и файлам в корневом каталоге.
Я в ситуации, когда мне нужно скопировать файлы на сервер точки общего доступа. Я хочу иметь возможность копировать файлы на сервер без использования подключенного сетевого диска (не нужно указывать Z: \ в пути). Как я могу предоставить учетные данные, чтобы я мог выполнять базовые функции ввода-вывода, такие как GetDirectories (), GetFiles (), IO.File.Copy () и т. Д.?
Я изучил следующие вещи, но мне не удалось заставить их работать:
- вызов API LogonUser путем указания имени пользователя и пароля в виде обычного текста, затем взятия токена из этого вызова и олицетворения этого пользователя с помощью нового экземпляра класса WindowsIdentity. Удалось получить токен, но имитация не сработала. Продолжал получать ошибки отказа в доступе.
CredUIPromptForCredentials / < вызовы API href = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa375178%28v=vs.85%29.aspx" rel = "nofollow"> CredUIPromptForWindowsCredentials, но я понимаю, что это только для причудливого пользовательского интерфейса 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
runas.exe /netonly /user:domain\username pathtoyourexe.exe
? - person Cᴏʀʏ   schedule 13.06.2012