Доступ к общему файлу (UNC) из удаленного ненадежного домена с учетными данными

Ответ Эндрю Гранта not помогает получить трассировку стека функции throwing , по крайней мере, не с GCC, потому что оператор throw не сохраняет текущую трассировку стека на его собственный, а обработчик уловов больше не будет иметь доступ к трассировке стека в этой точке.

Единственный способ - с помощью GCC - решить эту задачу - убедиться, что вы создаете трассировку стека на point команды throw и сохранить это с объектом исключения.

Этот метод требует, конечно, чтобы каждый код, который генерирует исключение, использует этот конкретный класс исключения.

Обновление 11 июля 2017 г. : Для получения некоторого полезного кода взгляните на ответ cahit beyaz, который указывает на http://stacktrace.sourceforge.net - я еще не использовал его но это выглядит многообещающе.

142
задан Randolpho 18 March 2009 в 16:25
поделиться

6 ответов

Способ решить Вашу проблему состоит в том, чтобы использовать API Win32 по имени WNetUseConnection.
Используйте эту функцию, чтобы соединиться с путем UNC с аутентификацией, НЕ подключить диск.

Это позволит Вам соединяться с удаленной машиной, даже если это не будет на том же домене, и даже если это имеет другое имя пользователя и пароль.

После того как Вы использовали WNetUseConnection, Вы сможете получить доступ к файлу через путь UNC, как будто Вы были на том же домене. Лучший способ, вероятно, через административное, созданное в долях.
Пример: \\computername\c$\\программа files\Folder\file.txt

Вот некоторый демонстрационный код C#, который использует WNetUseConnection.

Отметьте для NetResource, необходимо передать пустой указатель для lpLocalName и lpProvider. dwType должен быть RESOURCETYPE_DISK. lpRemoteName должен быть \\ComputerName.

167
ответ дан 23 November 2019 в 22:52
поделиться

Большинство серверов SFTP поддерживает SCP также, который может быть намного легче найти библиотеки для. Вы могли даже просто назвать существующий клиент от своего кода как pscp включенным с PuTTY.

, Если тип файла Вы работаете с, что-то простое как текстовый файл или XML-файл, Вы могли даже пойти, насколько записать Вашу собственную клиент-серверную реализацию для управления файлом с помощью чего-то как Дистанционная работа.NET или веб-сервисы.

2
ответ дан Ryan Bolger 19 March 2009 в 02:25
поделиться
  • 1
    Ха-ха, Вы сделали это! Я изменил test.db для использования полного пути /home/me/project/test.db... И это работает! – user1636922 21 September 2012 в 18:09

AFAIK, Вы не должны отображать путь UNC на букву диска для установления учетных данных для сервера. Я регулярно использовал сценарии пакетной обработки как:

net use \\myserver /user:username password

:: do something with \\myserver\the\file\i\want.xml

net use /delete \\my.server.com

Однако любая программа, работающая на той же учетной записи как Ваша программа, все еще смогла бы получить доступ ко всему это username:password имеет доступ к. Возможное решение могло состоять в том, чтобы изолировать Вашу программу в своей собственной учетной записи локального пользователя (доступ UNC локален для учетной записи, которая звонила NET USE).

Примечание: Используя SMB через домены не совсем хорошее использование технологии, IMO. Если безопасность настолько важна, то, что SMB испытывает недостаток в шифровании, является чем-то вроде увлажнителя совершенно отдельно.

16
ответ дан 23 November 2019 в 22:52
поделиться

Вместо WNetUseConnection, я рекомендовал бы NetUseAdd. WNetUseConnection является функцией прежней версии, это было заменено WNetUseConnection2 и WNetUseConnection3, но все те функции создают сетевое устройство, это видимо в Windows Explorer. NetUseAdd является эквивалентом вызова сетевого использования в командной строке DOS для аутентификации на удаленном компьютере.

При вызове NetUseAdd затем, последующие попытки получить доступ к каталогу должны успешно выполниться.

4
ответ дан 23 November 2019 в 22:52
поделиться

В то время как я не знаю меня, я, конечно, надеялся бы, что № 2 является неправильным... Я хотел бы думать, что Windows не собирается АВТОМАТИЧЕСКИ выделять мои данные для входа (меньше всего мой пароль!) к любой машине, уже не говоря о той, которая не является частью моего доверия.

Независимо, Вы исследовали архитектуру олицетворения? Ваш код собирается выглядеть подобным этому:

using (System.Security.Principal.WindowsImpersonationContext context = System.Security.Principal.WindowsIdentity.Impersonate(token))
{
    // Do network operations here

    context.Undo();
}

В этом случае, token переменной является IntPtr. Для получения значения для этой переменной необходимо будет назвать неуправляемый Windows API function LogonUser. Быстрое прохождение в pinvoke.net дает нам следующую подпись:

[System.Runtime.InteropServices.DllImport("advapi32.dll", SetLastError = true)]
public static extern bool LogonUser(
    string lpszUsername,
    string lpszDomain,
    string lpszPassword,
    int dwLogonType,
    int dwLogonProvider,
    out IntPtr phToken
);

Имя пользователя, домен и пароль должны казаться довольно очевидными. Взгляните на различные значения, которые могут быть переданы dwLogonType и dwLogonProvider для определения того что лучшие иски потребности.

Этот код не был протестирован, поскольку у меня нет второго домена здесь, где я могу проверить, но это должно, надо надеяться, поместить Вас на правильном пути.

4
ответ дан 23 November 2019 в 22:52
поделиться

Я видел опцию 3, реализованную с инструментами JScape довольно простым способом. Вы могли бы дать ему попытку. Это не свободно, но это делает свое задание.

1
ответ дан 23 November 2019 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: