2013-09-24 3 views
2

Я нашел этот вопрос где-то в Интернете, столкнувшись с той же проблемой. С небольшим изменением я уже задал вопрос ниже.:: createFile winApi с ошибкой 5 (access_denied). Является ли shell-программированием или другим решением или любым намеком.

Вопрос:

Я хочу получить доступ к файлу на удаленном компьютере (10.10.20.30), но я не мог понять, как войти в эту машину в моей программе. Есть ли простой win api, который берет сетевой путь, учетные данные и возвращает дескриптор файла? Я просто хочу получить доступ к папке \ 10.10.20.30 \ share \ test.txt. Любое предложение будет полезно.

извините за то, что не очень ясно в смысле кодирования. Деталь: Я хотел получить доступ к файлу, который совместно используется в общей папке, но мне не разрешено разрешение. Я использую :: CreateFile, чтобы получить handel файла. Но в этом случае я получаю код ошибки 5 (ACCESS_DENIED). Мне нужно использовать учетные данные пользователя (моего клиента) (пароль пользователя) для доступа к файлу, который является общим. Мне просто нужен дескриптор файла. Скажите мне, если я ошибаюсь :: CreateFile нельзя использовать в этом случае, используя или изменяя атрибуты безопасности, как говорит MSDN. CreateFile игнорирует член lpSecurityDescriptor при открытии существующего файла. Я также думал об использовании оболочки Window, но не смог повторить решение.

проблема Подробнее * Ну, так же, как на удаленной машине, у меня нет разрешения EveryOne. Позвольте мне объяснить на примере. Предположим, что есть сеть с определенным доменом, у которого по крайней мере 3 компьютера позволяют говорить 5. Теперь там есть C1 (клиент), C2 (пункт назначения), C3, C4, C5. Теперь в этом случае я создам файл (любой тип) на машине C2 и поместит его в папку MyFolder. Теперь сделайте это, и после этого удалите EveryOne. После этого добавьте C5 в качестве пользователя для доступа к нему. Теперь вы можете написать какой-нибудь код с реализацией только :: CreateFile и запустить его как на машине C1 (клиент), так и на C5 (у нее есть разрешение). Вы увидите, что клиент (C1) получит ошибку 5, что означает ACCESS_DENIED, но C5 выполнит его и получит файл. ...... Теперь снова повторяю свой вопрос. Мне нужно получить дескриптор файла любыми способами через мой имя пользователя и пароль, и моя программа получит дескриптор из этого C1 машины .. *

Пожалуйста, советы мне заранее спасибо

:: CreateFile завершается с Access Denied является программирование оболочки или другое решение или намек

+0

Возможно, вам нужно сначала использовать функцию [NetUseAdd] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa370645 (v = vs.85) .aspx). Это должно работать, если вы можете открыть «\\ 10.10.20.30 \ папку общего доступа» из проводника Windows. –

+0

@MichaelWalz Мне не разрешено открывать его через проводник. см. проблему выше. – user2809792

+0

Вы решили это? Есть ли простой win api, который берет сетевой путь, учетные данные и возвращает дескриптор файла? – AcidBurn

ответ

1

Когда CreateFile не работает ERROR_ACCESS_DENIED, это значит, что процесс, который вызывает CreateFile, является работающий под учетной записью пользователя, которая не имеет достаточных прав для выполнения этой операции.

Вы решить эту проблему путем:

  1. Учитывая, что пользователю достаточно прав.
  2. Запуск процесса под другой учетной записью пользователя, которая имеет достаточные права. Или используя олицетворение для вызова CreateFile с другим токеном пользователя.
  3. Защита файла, о котором идет речь, чтобы исходный пользователь с низкими правами имел право выполнить операцию.

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

+0

1. Предоставление этому пользователю достаточных прав. Если вы говорите, что делаете это по-человечески, то это не допустимо в моем случае. Если вы говорите, чтобы получить разрешение через код с удаленной машины. (я также ищу код) 2. Мне нужно выполнить авторизацию через мои учетные данные клиента, а не другого пользователя. 3. Я не понял, что это значит. .... ну, похоже, вы говорите, что это невозможно с помощью кодирования. Но я не могу сказать ничего невозможного, пока я не уверен на 100% ..... И спасибо за быстрый ответ ... :) – user2809792

+0

Если бы вы могли обойти безопасность с помощью кода клиента, это обеспечило бы нарушение безопасности. Следующий шаг - узнать о модели безопасности Windows. –

+0

Я пробовал, но не смог найти ссылку. Я не прошу вас искать его для меня. Но если у вас есть что-то в виду, пожалуйста, поделитесь. – user2809792

2

Если ваше приложение не работает под учетной записью пользователя, которая имеет достаточные разрешения для доступа к файлу, вам придется временно выдавать себя за пользователя, у которого есть доступ. Используйте LogonUser(), чтобы войти в нужную учетную запись и получить для нее токен, затем передать этот токен на ImpersonateLoggedOnUser(), чтобы выдать себя за этого пользователя, а затем позвонить CreateFile() (который будет использовать олицетворенные права) и использовать файл по мере необходимости, а затем закрыть файл и позвоните RevertToSelf(), чтобы прекратить выдавать себя за работу.

Смежные вопросы