Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
bd_13
100 / 85 / 38
Регистрация: 05.11.2015
Сообщений: 425
#1

Скопировать данные из одной учетной записи ОС в другую - Visual Basic .NET

19.12.2016, 09:27. Просмотров 489. Ответов 17
Метки нет (Все метки)

Всем привет! Хочу попробовать написать программку для копирования данных с одной учетки в другую, а именно папки рабочий стол и мои документы.
1. Как я понимаю нужно вначале определить что за ОС стоит на компе.
2. получить список пользователей, залогинившихся на компьютер, скажем в Combobox.
3. Выполнить копирование файлов.
Структура программы проста:
на форме 2 Combobox(из которых выбираем с какой учетки и в какую будет произведено копирование);
кнопка, при нажатии на которую будет происходить непосредственно копирование файлов
и progressbar(по возможности) отобразить ход копирования
Какие есть идеи? заранее спасибо!)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2016, 09:27
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Скопировать данные из одной учетной записи ОС в другую (Visual Basic .NET):

Скопировать строку из DGV с одной формы в другую
Здравствуйте, необходимо произвести списание номенклатурной единицы, т.е....

Как скопировать папку (с подпапками и файлами) из одной директории в другую?
нужно скопировать папку ( с подпапками и файлами) из одной директории в другую....

Отправка почты с использованием доменной учетной записи
Добрый день. Администраторы сети сделали мне большую подляну. Закрывают...

Работа с Token. Ошибка при авторизации в другой учетной записи
Доброго время суток.. Дорогие форумчане помогите с обработкой token'a в...

Можно ли узнать имя учетной записи для входа в Windows
VB 2010 Подскажите как узнать и извлеч из него скажем 4ю и 5ю цифру.

Выбрать из папки несколько типов файлов и скопировать в другую папку
Необходимо выбрать из папки файлы с расширением docx, pdf, rar и скопировать их...

17
Orlangur1991
1023 / 957 / 226
Регистрация: 28.11.2014
Сообщений: 1,463
19.12.2016, 10:42 #2
1)определять какая стоит ос нет смысла
2)почему именно залогинившихся? Всех пользователей, тут два варианта,
первый: по пути "C:\Users" просматриваем какие папки созданы и исключаем системные имена
второй: более универсальный, через реестр.
3)далее ищешь файлы в нужных тебе каталогах и добавляешь их в какой-то список, типа listbox.
4) Когда нашел все файлы, начинаешь копировать их, в progressbar maximum будет значение найденных файлов, а после кажого скопированного файла к progressbar.value будет прибавляться 1. Вот и отображение прогресса
0
bd_13
100 / 85 / 38
Регистрация: 05.11.2015
Сообщений: 425
20.12.2016, 09:26  [ТС] #3
Orlangur1991,
Цитата Сообщение от Orlangur1991 Посмотреть сообщение
1)определять какая стоит ос нет смысла
а разве учетки на XP хранятся в C:\users? а не в C:\Documents and Settings? для этого и нужно определить ОС, что бы знать откуда копировать и какой путь верен.
нашел всех пользователей через реестр:
vb.net
1
2
3
4
5
6
7
8
9
10
 Dim _RegistryKey As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList")
        For Each _KeyName As String In _RegistryKey.GetSubKeyNames()
            Using SubKey As RegistryKey = _RegistryKey.OpenSubKey(_KeyName)
                Dim _Users As String = DirectCast(SubKey.GetValue("ProfileImagePath"), String)
                Dim _Username As String = System.IO.Path.GetFileNameWithoutExtension(_Users)
                If _Users.ToLower.Contains("\users") Then
                    ComboBox1.Items.Add(_Username)
                End If
            End Using
        Next
0
Orlangur1991
1023 / 957 / 226
Регистрация: 28.11.2014
Сообщений: 1,463
20.12.2016, 10:56 #4
bd_13, я о чем и говорю, если определять через реестр, то нет смысла определять ос
Более менее накидал вариант, правда пока кривоват

Добавлено через 25 минут
Для нахождения всех учетных записей и заполнения combobox
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 Public List As New ListBox ' временный listbox
    Public tmp As New ListBox ' временный listbox
    Dim pathes As New ListBox 'listbox с путями
    Dim docs As Boolean = False ' показывает, есть ли в имени каталога document and settings
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Try 'заполняем listbox1 всем, что есть по пути в реестре
            For i As Integer = 0 To My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList", False).SubKeyCount - 1
                List.Items.Add(My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList", False).GetSubKeyNames(i))
                tmp.Items.Add(My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList", False).GetSubKeyNames(i))
            Next
 
            For i = 0 To tmp.Items.Count - 1
                Dim readValue = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" & tmp.Items.Item(i), "ProfileImagePath", Nothing)
                If readValue = "" Then ' проверяем, что ProfileImagePath не пуст
 
                Else
                    Dim s As String = readValue
 
                    Dim Result() As String = Split(s, "") 'пилим ProfileImagePath,чтобы получить имя пользователя
                    Dim s1 As String = Result(0)
                    Dim s2 As String = Result(1)
                    Dim s3 As String = Result(2)
                    If s2 = "Users" Or s2 = "Documents and Settings" Then
                        If tmp.Items.Item(i).ToString.Length > 8 Then ' проверяем, что SID больше 8 символов
                            If s2 = "Documents and Settings" Then
                                docs = True
                            End If
                            ComboBox1.Items.Add(s3) ' заполняем 1 combobox
                            pathes.Items.Add(s) 'заполняем listbox путями
                            ComboBox2.Items.Add(s3) ' заполняем 2 combobox
                        End If
                        Else
 
                        End If
 
                    End If
            Next
            If ComboBox2.Items.Count > 1 Then
                ComboBox1.SelectedIndex = 0
                ComboBox2.SelectedIndex = 1
                Button4.Enabled = True
            Else
                ComboBox1.SelectedIndex = 0 'если учетная запись всего одна, то ничего никуда копироваться не будет
                ComboBox2.SelectedIndex = 0
                Button4.Enabled = False
            End If
 
 
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
Для контролирования, чтобы не была выбрана одна и та же учетная запись
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        If ComboBox1.SelectedIndex = ComboBox2.SelectedIndex Then ' кнопка копирования будет заблокирована, если в обоих combobox выбрана одна и та же учетная запись
            Button4.Enabled = False
        Else
            Button4.Enabled = True
        End If
    End Sub
    Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedIndexChanged
        If ComboBox1.SelectedIndex = ComboBox2.SelectedIndex Then ' кнопка копирования будет заблокирована, если в обоих combobox выбрана одна и та же учетная запись
            Button4.Enabled = False
        Else
            Button4.Enabled = True
        End If
    End Sub
Процедура поиска файлов
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Dim files As New ListBox ' хранилище все найденных файлов
    Dim file As String() ' массив для файлов
 
    Private Sub Search(ByVal fold As String, ByVal mask As String, ByVal Recur As Boolean)
 
        Dim stack As Stack(Of String) = New Stack(Of String)
        stack.Push(fold)
        Do 'Цикл начинается
            fold = stack.Pop() 'Если мы не ищем файлы в подпапках то в "stack" будет одна запись и цикл закончится быстро
            Try
                file = System.IO.Directory.GetFiles(fold, mask)
 
                For i = 0 To file.Count - 1
                    files.Items.Add(file(i))
                Next
 
                Label2.Text = files.Items.Count 'отображает кол-во найденных файлов, пригодных к копированию
 
                If Recur Then 'Если необходимо сканировать подпапки
                    For Each folder In IO.Directory.GetDirectories(fold)
                        stack.Push(folder)
                    Next
                End If
 
            Catch ex As Exception
            End Try
 
        Loop Until stack.Count = 0
    End Sub
Сама кнопка копирования
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        If BackgroundWorker1.IsBusy = False Then
            BackgroundWorker1.RunWorkerAsync()
        End If
 
    End Sub
    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim doc As String = ""
        If docs = False Then
            doc = "\Documents"
        Else
            doc = "\My Documents"
        End If
        pth = pathes.Items.Item(ComboBox1.SelectedIndex) & doc
        Search(pth, "*.*", True)
        Dim max As Integer = files.Items.Count
        Label2.Text = max
        ProgressBar1.Maximum = max
        Dim pth2 As String = pathes.Items.Item(ComboBox2.SelectedIndex) & doc
        copyfiles(pth, pth2)
    End Sub
    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        MsgBox("Все файлы скопированы")
        docs = False
        z = 0
        ProgressBar1.Value = 0
        Label1.Text = 0
        Label2.Text = 0
 
    End Sub
Процедура копирования
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim z As Integer = 0
    Sub copyfiles(ByVal path1 As String, ByVal path2 As String)
        Dim name() As String
        For i = 0 To files.Items.Count - 1
            name = Split(files.Items.Item(i), path1)
 
            Dim p As String = IO.Path.GetDirectoryName(name(1))
 
            If IO.Directory.Exists(path2 & p) = False Then
                z = z + 1
                Label1.Text = z
                ProgressBar1.Value = z
                My.Computer.FileSystem.CopyDirectory(path1 & p, path2 & p)
            Else
                IO.File.Copy(files.Items.Item(i), path2 & name(1), True)
                z = z + 1
                Label1.Text = z
                ProgressBar1.Value = z
            End If
        Next
    
    End Sub
С именами переменных надо разобраться, чтобы не запутаться, проверил на windows 7 и на server 2003, вроде как работает, только пустые папки игнорирует
1
bd_13
100 / 85 / 38
Регистрация: 05.11.2015
Сообщений: 425
20.12.2016, 14:45  [ТС] #5
Orlangur1991, вау) спасибо большое) буду смотреть)

Добавлено через 3 часа 45 минут
Orlangur1991, у меня почему то твой код для нахождения записей не работает. ничего не находит...сижу, разбираюсь почему...
0
Orlangur1991
1023 / 957 / 226
Регистрация: 28.11.2014
Сообщений: 1,463
20.12.2016, 16:26 #6
bd_13, процедура поиска? проверь путь, который ей передается, возможно он не верен
0
bd_13
100 / 85 / 38
Регистрация: 05.11.2015
Сообщений: 425
20.12.2016, 17:24  [ТС] #7
Orlangur1991, и все же осмелюсь попросить у вас проек
0
Orlangur1991
1023 / 957 / 226
Регистрация: 28.11.2014
Сообщений: 1,463
20.12.2016, 17:42 #8
Лучший ответ Сообщение было отмечено bd_13 как решение

Решение

bd_13, Посмотри конечно, но там то же самое)
1
Вложения
Тип файла: zip files_from_one_user_to_another.zip (15.6 Кб, 2 просмотров)
bd_13
100 / 85 / 38
Регистрация: 05.11.2015
Сообщений: 425
20.12.2016, 20:29  [ТС] #9
Orlangur1991, странная хрень, почти мистика) но твой проект работает)))
хз в чем проблема была!)) спасибо большое)
0
OwenGlendower
Супер-модератор
Эксперт .NET
8757 / 7761 / 3322
Регистрация: 17.03.2014
Сообщений: 15,263
Записей в блоге: 1
20.12.2016, 21:46 #10
Цитата Сообщение от Orlangur1991 Посмотреть сообщение
Для нахождения всех учетных записей и заполнения combobox
Небрежно написанный код.

1) Вызовы OpenSubKey и GetSubKeyNames в цикле приводят к трате системных дескрипторов (которые к тому же надо закрывать) и лишним выделениям памяти в куче.

2) Использование элемента управления ListBox для временного хранения данных тоже плохая идея. Он слишком тяжелый для этого. Лучше использовать List(Of T).

3) Харкод путей "Users" и "Documents and Settings" лучше убрать и проверять что путь к профилю находится в папке профилей путь к которому можно получить из уже открытого ключа SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList.

4) Проверка что длина SID больше 8 символов вызывает сомнения. С одной стороны она позволяет отбросить системные учетные записи. С другой же мы рискуем проигнорировать учетную запись локального администратора. Я бы ограничился проверкой пути в п.3.

В итоге код можно переписать так
Кликните здесь для просмотра всего текста
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim names() As String
Using keyProfileList As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList", False)
    Dim profilesDirectory As String = keyProfileList.GetValue("ProfilesDirectory")
    names = keyProfileList.GetSubkeyNames()
    For I = 0 To names.Length - 1
        Using key As RegistryKey = keyProfileList.OpenSubkey(names(I), False)
            ' Локальные SID начинаются с 
            If Not names(I).StartsWith("S-1-5-21-") Then Continue For
            
            Dim profileImagePath As String = key.GetValue("ProfileImagePath")
            If Not profileImagePath.StartsWith(profilesDirectory, StringComparison.OrdinalIgnoreCase) Then Continue For
            
            Dim userName As String = profileImagePath.Substring(profilesDirectory.Length).TrimStart(""c)
 
            pathes.Add(profileImagePath)
            ComboBox1.Items.Add(userName)
            ComboBox2.Items.Add(userName)
 
        End Using
    Next
End Using
2
bd_13
100 / 85 / 38
Регистрация: 05.11.2015
Сообщений: 425
22.12.2016, 11:07  [ТС] #11
Orlangur1991, а как помимо моих документов еще скопировать и данные рабочего стола?
0
Orlangur1991
1023 / 957 / 226
Регистрация: 28.11.2014
Сообщений: 1,463
22.12.2016, 11:44 #12
bd_13, после того, как будут скопированы мои документы, запускать процедуру поиска и копирования для пути рабочего стола 1 и 2 юзера
Либо сразу запускать поиск по 2 директориям, чтобы получить результаты и из документов и с рабочего стола, а процедуру копирования вызвать 1 раз
0
bd_13
100 / 85 / 38
Регистрация: 05.11.2015
Сообщений: 425
22.12.2016, 12:14  [ТС] #13
Orlangur1991, буду благодарен за пример.
и еще очень интересный вопрос. возможно ли осуществить копирование учетки по сети?
скажем надо скопировать одну учетку с одного компа на другой, зная имя(либо ip адрес) компов.
например, из combobox1 и combobox2 выбираются имена компьютеров(либо ip адреса)
в combobox3 и в combobox4 выбираем имя учетки, которую нужно скопировать, и по кнопке скопировать данные?
0
Orlangur1991
1023 / 957 / 226
Регистрация: 28.11.2014
Сообщений: 1,463
22.12.2016, 12:30 #14
Цитата Сообщение от bd_13 Посмотреть сообщение
скопировать одну учетку с одного компа на другой, зная имя(либо ip адрес) компов
В принципе не должно быть проблем, если расшарить все нужные каталоги
0
Orlangur1991
1023 / 957 / 226
Регистрация: 28.11.2014
Сообщений: 1,463
22.12.2016, 14:08 #15
bd_13, если без особых переделок, что чтобы захватить ещё и рабочий стол, как-то так
А с сетью уже не помогу, могу только подкинуть идеи
1) надо сканировать всю локальную сеть, чтобы найти доступные машины
2) на них должны быть расшарены папки с документами и рабочим столом и содержать в себе, к примеру, имя пользователя и название папки (Vasya_Desktop) или (Vasya_Docs)
3)Таким образом можно будет получить список пользователей на компе + доступ к нужным файлам
1
Вложения
Тип файла: zip files_from_one_user_to_another.zip (16.1 Кб, 1 просмотров)
OwenGlendower
Супер-модератор
Эксперт .NET
8757 / 7761 / 3322
Регистрация: 17.03.2014
Сообщений: 15,263
Записей в блоге: 1
22.12.2016, 14:17 #16
Цитата Сообщение от bd_13 Посмотреть сообщение
возможно ли осуществить копирование учетки по сети?
Если программа будет запущена от имени администратора, то можно обращаться к путям вида \\address\c$\Users\...
1
bd_13
100 / 85 / 38
Регистрация: 05.11.2015
Сообщений: 425
22.12.2016, 14:51  [ТС] #17
Orlangur1991, ошибка на progressbar вылетает:
в чем может быть проблема?
0
Миниатюры
Скопировать данные из одной учетной записи ОС в другую  
Orlangur1991
1023 / 957 / 226
Регистрация: 28.11.2014
Сообщений: 1,463
22.12.2016, 16:13 #18
bd_13, попробуй так
0
Вложения
Тип файла: zip files_from_one_user_to_another.zip (16.4 Кб, 1 просмотров)
22.12.2016, 16:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2016, 16:13
Привет! Вот еще темы с решениями:

Как скопировать данные из одной записи таблицы в другую?
Уже поднимал этот вопрос (http://relib.com/forums/topic.asp?id=772396), но...

Скопировать данные из одной таблицы БД в другую
как можно в одном БД из одной таблицы по ид перенести в другую Перечитайте...

Скопировать данные из одной ячейки в другую
Имеется столбец с данными типа : 2613885000010 2613928000014 2613900000018...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru