Страница: 1 |
|
Вопрос: олицетворении учётной записи пользователя
|
Добавлено: 12.04.07 00:18
|
|
Автор вопроса: Георгич
|
Вопрос в следующем, можно ли при олицетворении учётной записи пользователя, обойти пароль администратора, или если, администратор изменил пароль, то и в программе тоже изменился пароль, так как сказать используй пароль тот, что у администратора
Может быть, есть способы олицетворения учётной записи без пароля администратора?
Конфигурация моей программы такова, что все данные хранятся (для более лучшей безопасности) у администратора в папке его профиля, например: С:\Documents and Settings\1\
Далее, я как администратор, назначаю через файлы настройки, допуски пользователей к данным. При загрузке проги считывается файлы настройки и в зависимости от результата считывания, даётся допуск к данным или нет, соответственно допуск осуществляется через олицетворения учётной записи пользователя
Ниже упрощённыё код, который читается так: если прогу запустил администратор, то
считай текстовый файл по указанному пути, если программу запустил пользователь с учетной записью максим, то считай, тот же файл , а если прогу запустил какой то другой пользователь, то ему доступ запрещён прога не появляется
Переменна, Password = "абвгдеёжзий", так сказать, и есть камень преткновения
Если у кого по этому поводу мысли?
Imports System.Security.Principal
Public Class Form1
Inherits System.Windows.Forms.Form
Dim ПутьПрофПольз As String
Dim Диск As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Личность As WindowsIdentity 'Предоставляет пользователя Windows
Личность = WindowsIdentity.GetCurrent 'Предоставляет текущего пользователя windows
Dim Принципиал As New WindowsPrincipal(Личность) 'Осуществляем поверку членства в группе текущего пользователя
If Принципиал.IsInRole(WindowsBuiltInRole.Administrator) = True Then 'Если текущий пользователь является администратором, то
Dim ПрофПольз As System.Environment 'Предоставляет текущею среду
ПутьПрофПольз = ПрофПольз.GetEnvironmentVariables("USERPROFILE").ToString() 'Предоставляет путь к папке профиля пользователя
If System.IO.File.Exists(ПутьПрофПольз & "\Дерево\Каталоги\СписокКаталогов.txt") Then 'Если файл существует, то
Dim Чтение As New System.IO.StreamReader(ПутьПрофПольз & "\Дерево\Каталоги\СписокКаталогов.txt") '
Do While Чтение.Peek() <> -1
TextBox1.Text &= (Чтение.ReadLine) & vbNewLine 'Считыаем файл в текстовое поле
Loop
Чтение.Close()
End If
Else 'Если текущий пользователь не является администратором( пользователь с другой учётной записью ), то
Dim ПрофПольз As System.Environment 'Предоставляет текущею среду
Dim UserName, Domain, Password, Имя, ПользовательМаксим As String
ПользовательМаксим = ПрофПольз.GetEnvironmentVariable("USERNAME").ToString() 'Получаем имя пользователя
UserName = "1" 'Это имя пользователя администратора
Domain = "comp" 'Это домен
Password = "абвгдеёжзий" 'Это пароль администратора, при чем, если пароль неверный или пустой WindowsXP даст ошибку
Диск = ПрофПольз.GetEnvironmentVariable("SystemDrive").ToString 'Получаем системный диск текущей среды
ПутьПрофПольз = Диск & "\Documents and Settings\" & UserName 'Назначаем путь к профилю, который будет равен пути как у администратора
Dim ПутьКспискуКталогоа As String = (ПутьПрофПольз & "\Дерево\Каталоги\СписокКаталогов.txt") 'Назначаем путь к файлу
If ПользовательМаксим = "максим" Then 'Если текущий пользователь, под именем < максим >, то
Dim NewIdentity As WindowsIdentity 'Предоставляет пользователя Windows
NewIdentity = ПолучитьКонкретногоПользователя(UserName, Domain, Password) 'Регистрируем новую личность
If NewIdentity Is Nothing Then
MsgBox("Не правельные данные")
Else
Dim NewContext As WindowsImpersonationContext 'Предоставляет пользователя Windows для Олицетворение
NewContext = NewIdentity.Impersonate() 'Олицетворение новой личности
If System.IO.File.Exists(ПутьПрофПольз & "\Дерево\Каталоги\СписокКаталогов.txt") Then 'Если файл существует, то
Dim Чтение As New System.IO.StreamReader(ПутьПрофПольз & "\Дерево\Каталоги\СписокКаталогов.txt")
Do While Чтение.Peek() <> -1
TextBox1.Text &= (Чтение.ReadLine) & vbNewLine 'Считыаем файл в текстовое поле
Loop
Чтение.Close()
End If
NewContext.Undo() 'Возврат к первоначальной личности
End If
Else 'Если текущий пользователь не под именем максим, то
MsgBox(" Вы не имеете допуск . Вход запрещён ", MsgBoxStyle.Critical, "Вход запрещён")
If MsgBoxResult.OK Then
Exit Sub
End If
End If
End If
End Sub
'Эта API – функция получает маркер безопасности конкретного пользователя
Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, ByRef phToken As IntPtr) As Integer
Private Enum Logon
Interactive = 2
NetworkCleartext = 8
End Enum
Private Enum Provider
[Default] = 0
WindowsNt35 = 1
WindowsNt40 = 2
Windows2000 = 3
End Enum
'Эта API – функция дублирует маркер безопасности, чтобы его можно использовать
Private Declare Auto Function DuplicateToken Lib "advapi32.dll" (ByVal ExsitingTokenHidle As IntPtr, ByVal ImpersonationLevel As Integer, ByRef DuplicateTokenHidle As IntPtr) As Integer
'Эта функция, вызывает функции Win32 API, возвращает объект WindowsIdentity, соответствующий конкретному пользователю
Private Function ПолучитьКонкретногоПользователя(ByVal UserName As String, ByVal Domain As String, ByVal Password As String) As WindowsIdentity
Dim SecurityToken, TokenDuplicate As IntPtr
If LogonUser(UserName, Domain, Password, Logon.Interactive, Provider.Default, SecurityToken) > 0 Then
DuplicateToken(SecurityToken, 2, TokenDuplicate)
Return New WindowsIdentity(TokenDuplicate)
Else
Return Nothing
End If
End Function
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
End Sub
End Class
Ответить
|
Номер ответа: 1 Автор ответа: BUMM ®
Вопросов: 8 Ответов: 482
|
Профиль | | #1
|
Добавлено: 13.04.07 22:37
|
Вопрос в следующем, можно ли при олицетворении учётной записи пользователя, обойти пароль администратора, или если, администратор изменил пароль, то и в программе тоже изменился пароль, так как сказать используй пароль тот, что у администратора
Ну ты даёшь, ты практически в своей проге должен "взламывать" пароль админа, если это может сделать твоя прога, то почему другая не может?
Мне кажется тебе надо пересмотреть подход к проблеме, может ипользовать ролевую аутентификацию винды и задавать права на папку а юзверей разделить в группы и группам давать полномочия?
Ответить
|
Страница: 1 |
Поиск по форуму