Есть ли способ определить, доступен ли для записи каталог Windows без записи в него для проверки? - PullRequest
1 голос
/ 06 декабря 2009

У меня есть какой-то старый код vb6, который проверяет, доступен ли для записи каталог Windows, путем ЗАПИСИ к нему и последующего чтения значения обратно.

Но ... у нас есть антивирусный сканер, который считает это подозрительным поведением, поэтому я хочу проверить его, не трогая его.

Какой-либо Windows API призывает к этому? (Идеально для Win 98 и выше)

Ответы [ 5 ]

5 голосов
/ 06 декабря 2009

Здесь следует помнить, что файловая система является нестабильной. Единственный способ увидеть, как этот код используется, - сначала проверить, доступна ли для записи папка, а затем попытаться написать то, что вы хотели написать. Проблема здесь в том, что с изменчивой файловой системой вещи могут измениться между тем, когда вы делаете вашу проверку и когда вы пытаетесь писать. Как следствие, вы все равно должны иметь возможность обрабатывать исключение, если ваша запись не удалась . Это означает, что первоначальная проверка в значительной степени пропала Лучше приложить усилия для написания лучшего обработчика исключений.

Кроме того, для Windows 2000 и более поздних версий Windows напрямую должна быть доступна для записи только в том случае, если пользователь работает от имени администратора. В течение очень долгого времени работа в качестве администратора была обычной практикой, но люди начинают понимать, что это не очень хорошая идея. В долгосрочной перспективе для вашей программы не стоит делать что-либо, что требует такой работы.

На самом деле, начиная с Windows Vista, пользователь по умолчанию не выполняет никаких функций администратора, даже если он входит в учетную запись администратора. Вместо этого им приходится вручную запускать программу от имени администратора или ждать проверки безопасности, чтобы система не смогла выйти из системы.

4 голосов
/ 06 декабря 2009

Если у вас есть код VB6, вам следует потратить время на его исправление, чтобы ему вообще не нужно было писать в каталог Windows, потому что независимо от того, являетесь ли вы администратором или нет, если вы не работаете в Microsoft, вам следует Считайте, что каталог запрещен.

Однако вы должны учитывать, что в Windows 98 пользователь всегда будет иметь возможность записи в каталог Windows. На Windows XP локальные администраторы будут. В Windows Vista и Seven даже администраторы этого не сделают, если ваше приложение не было повышено.

Таким образом, вы можете проверить, находится ли пользователь во встроенной роли BUILTIN \ Administrators, используя CheckTokenMembership . Это будет неверно для не администраторов или пользователей с повышенными правами. Это не гарантирует, что вы можете писать в каталог Windows, но это будет правильно в большинстве случаев времени. Затем вы можете добавить логику обработки ошибок для случая, когда вызов фактически завершился неудачей.

Но опять же, вы должны воспользоваться возможностью исправить код и не использовать каталог Windows.

0 голосов
/ 13 августа 2014
Function IsPathAccessible(ByVal sPath As String) As Boolean
    On Error GoTo ErrHandler

    FileSystem.SetAttr sPath, vbNormal
    IsPathAccessible = True
    Exit Function

ErrHandler:
    IsPathAccessible = False
End Function
0 голосов
/ 07 декабря 2009

Вот функция, которая сделает это. Я быстро адаптировал это из некоторого другого вида кода, поэтому, если вы используете его, вам нужно добавить обработку ошибок (например, несуществующий каталог просто возвращает False. Я понятия не имею, понравится ли вашему антивирусному программному обеспечению это или нет.

Function FolderIsReadOnly(ByVal FolderSpec As String) As Boolean
   Dim rst As Long
   Dim udtW32FindD As WIN32_FIND_DATA
   Dim lngFHandle As Long
   Dim strFolder As String 'set to FolderSpec parameter so I can change it

   If Len(FolderSpec) = 0 Then
      FolderIsReadOnly = False
      Exit Function
   End If

   strFolder = FolderSpec
   If Right$(strFolder, 1) <> "\" Then
      strFolder = strFolder & "\"
   End If
   strFolder = strFolder & "*"   'add the wildcard allows finding share roots

   lngFHandle = FindFirstFile(strFolder, udtW32FindD)
   If lngFHandle <> INVALID_HANDLE_VALUE Then
      Call FindClose(lngFHandle)
      FolderIsReadOnly = (udtW32FindD.dwFileAttributes And FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY
   End If

End Function
0 голосов
/ 06 декабря 2009

Для Windows 2000 и выше вы можете использовать GetNamedSecurityInfo () и AccessCheck (), но я думаю, что это вызов для VB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...