Ответ Эндрю Гранта not помогает получить трассировку стека функции throwing , по крайней мере, не с GCC, потому что оператор throw не сохраняет текущую трассировку стека на его собственный, а обработчик уловов больше не будет иметь доступ к трассировке стека в этой точке.
Единственный способ - с помощью GCC - решить эту задачу - убедиться, что вы создаете трассировку стека на point команды throw и сохранить это с объектом исключения.
Этот метод требует, конечно, чтобы каждый код, который генерирует исключение, использует этот конкретный класс исключения.
Обновление 11 июля 2017 г. : Для получения некоторого полезного кода взгляните на ответ cahit beyaz, который указывает на http://stacktrace.sourceforge.net - я еще не использовал его но это выглядит многообещающе.
Способ решить Вашу проблему состоит в том, чтобы использовать API Win32 по имени WNetUseConnection.
Используйте эту функцию, чтобы соединиться с путем UNC с аутентификацией, НЕ подключить диск.
Это позволит Вам соединяться с удаленной машиной, даже если это не будет на том же домене, и даже если это имеет другое имя пользователя и пароль.
После того как Вы использовали WNetUseConnection, Вы сможете получить доступ к файлу через путь UNC, как будто Вы были на том же домене. Лучший способ, вероятно, через административное, созданное в долях.
Пример: \\computername\c$\\программа files\Folder\file.txt
Вот некоторый демонстрационный код C#, который использует WNetUseConnection.
Отметьте для NetResource, необходимо передать пустой указатель для lpLocalName и lpProvider. dwType должен быть RESOURCETYPE_DISK. lpRemoteName должен быть \\ComputerName.
Большинство серверов SFTP поддерживает SCP также, который может быть намного легче найти библиотеки для. Вы могли даже просто назвать существующий клиент от своего кода как pscp включенным с PuTTY.
, Если тип файла Вы работаете с, что-то простое как текстовый файл или XML-файл, Вы могли даже пойти, насколько записать Вашу собственную клиент-серверную реализацию для управления файлом с помощью чего-то как Дистанционная работа.NET или веб-сервисы.
/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 испытывает недостаток в шифровании, является чем-то вроде увлажнителя совершенно отдельно.
Вместо WNetUseConnection, я рекомендовал бы NetUseAdd. WNetUseConnection является функцией прежней версии, это было заменено WNetUseConnection2 и WNetUseConnection3, но все те функции создают сетевое устройство, это видимо в Windows Explorer. NetUseAdd является эквивалентом вызова сетевого использования в командной строке DOS для аутентификации на удаленном компьютере.
При вызове NetUseAdd затем, последующие попытки получить доступ к каталогу должны успешно выполниться.
В то время как я не знаю меня, я, конечно, надеялся бы, что № 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 для определения того что лучшие иски потребности.
Этот код не был протестирован, поскольку у меня нет второго домена здесь, где я могу проверить, но это должно, надо надеяться, поместить Вас на правильном пути.
Я видел опцию 3, реализованную с инструментами JScape довольно простым способом. Вы могли бы дать ему попытку. Это не свободно, но это делает свое задание.