Показаны сообщения с ярлыком UAC. Показать все сообщения
Показаны сообщения с ярлыком UAC. Показать все сообщения

среда, 3 июля 2019 г.

Настройка общего доступа и доступа по админским шарам с Windows XP на Windows 10

Недавно решил попробовать перекинуть файлы из (comp1) Windows XP на (comp2) Windows 10, ввел на comp1 в адресной строке проводника ip адрес comp2 (192.168.1.3) и получил сообщение об ошибке «Указанное сетевое имя более недоступно» (смотрите рисунок 1). 


Рисунок 1. Сообщение об ошибке "Указанное сетевое имя более недоступно" в Windows XP

При этом сам ip адрес 192.168.1.3 пингуется. На форуме oszone.net нашел решение, что необходимо на Windows 10 включить протокол SMB 1.0. Для этого необходимо запустить «Панель управления», отобразить «Все элементы панели управления», запустить «Программы и компоненты» (смотрите цифру 1 на рисунке 2). Потом нажать на кнопку «Включение или отключение компонентов Windows» (смотрите цифру 2 на рисунке 2). 

Рисунок 2. Открытие окна "Компоненты Windows" в Windows 10

В окне «Компоненты Windows» найти и выбрать опции «Поддержка общего доступа к файлам SMB 1.0/CIFS», «Клиент SMB 1.0/CIFS», «Сервер SMB 1.0/CIFS» (смотрите рисунок 3). 

Рисунок 3. Включение поддержки SMB 1.0 в Windows 10

После этого необходимо перезагрузить компьютеры comp1 и comp2. Пробуем еще раз на компьютере comp1 ввести в адресной строке проводника ip адрес comp2 (192.168.1.3). Видим, что данное сообщение не появилось и открылось окно с общими папками, общими принтерами на компьютере comp2 с Windows 10, или пустое окно как у меня, если общих папок и общих принтеров нет (смотрите рисунок 4). 

Рисунок 4. Доступ к сетевым ресурсам Windows 10 из Windows XP

Мы рассмотрели настройку, касающуюся общего доступа на Windows 10. 

Теперь рассмотрим настройку доступа по админским шарам. Пробуем ввести на comp1 в адресной строке проводника ip адрес comp2 (\\192.168.1.3) вместе с админской шарой C$ (\\192.168.1.3\C$) и получим окно ввода логина и пароля (например: логин user, пароль user) пользователя (смотрите рисунок 5). 

Рисунок 5. Запрос логина и пароля при заходе на Windows 10 по админской шаре

Данный пользователь должен быть заведен на компьютере comp2 и иметь на данном компьютере права локального администратора, т.е. учетная запись должна находиться в группе «Администраторы». Пробуем ввести логин user и пароль user и получим сообщение о том что доступ запрещен. Почему так вышло, спросите вы? Ответ я нашел на этих сайтах ссылка 1, ссылка 2. Вкратце расскажу своими словами. Это потому-что Microsoft придумали новую развлекаловку под названием Remote UAC. Для учетных записей входящих в группу локальных администраторов доступ в Windows 10 закрыт и его необходимо открывать через реестр (То есть через реестр мы должны отключить этот Remote UAC). Правда для встроенной учетной записи локального администратора (Администратор) в Windows 10 доступ к админским шарам есть. Данная учетная запись по умолчанию отключена, поэтому ее нужно включить и задать пароль. Чтобы открыть доступ для учетных записей входящих в группу локальных администраторов (например, логин user) необходимо в Windows 10 запустить редактор реестра (редактор реестра запускается с правами администратора). Перейти в раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System (смотрите цифры 1,2 рисунка 6).

Рисунок 6. Отключаем Remote UAC через создания ключа реестра

В этом разделе создать параметр типа DWORD (32-бита) (смотрите цифру 3 рисунка 6) назвать его LocalAccountTokenFilterPolicy и присвоить ему значение 1 (смотрите цифру 4 рисунка 6). После этого необходимо перезагрузить компьютеры comp1 и comp2. Пробуем еще раз на компьютере comp1 ввести в адресной строке проводника ip адрес comp2 (\\192.168.1.3) вместе с админской шарой C$ (\\192.168.1.3\C$). В возникшем окне ввода логина и пароля вбиваем, например логин user, пароль user, видим, что доступ работает и нам открылся в проводнике список папок диска C на Windows 10 (смотрите рисунок 7). 

Рисунок 7. Открытая админская шара диска C$ Windows 10 из Windows XP

пятница, 21 июня 2019 г.

Задействуем UAC в приложениях написанных на Delphi 7

UAC – это Контроль Учетных Записей (Wikipedia), используется для повышения привилегий в том случае если вашему приложению это необходимо. Появился в Windows Vista и присутствует Windows 7, 8, 10. Необходимо убедится в том, что UAC включен. В Windows 7 это можно проверить, открыв «Панель управления» - «Учетные записи пользователей» - «Изменение параметров контроля учетных записей» - убедится, что установлен уровень «По умолчанию» (Смотрите рисунок 1).

 Рисунок 1. Включение UAC в Windows 7

Создадим тестовое приложение, которое будет писать в реестр Windows выбираемые из списка значения, правда путь куда мы будем записывать значения требуют повышения привилегий. Откроем Delphi 7 и создадим новый проект. Присвоим ему имя p12.dpr. Сохраним основной модуль под именем p12_unit.pas. Чтобы научить наше приложение работать с UAC, необходимо создать в папке проекта файл манифеста, назовём его Win7UAC.manifest. Содержимое файла следующее:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" name="App" version="3.1.0.0" processorArchitecture="*"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!--The ID below indicates application support for Windows Vista -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
      <!--The ID below indicates application support for Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
      <!--The ID below indicates application support for Windows 8 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> 
      <!--The ID below indicates application support for Windows 8.1 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> 
      <!--The ID below indicates application support for Windows 10 --> 
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
    </application>
  </compatibility></assembly>

Основным, важным моментом в файле манифеста является строчка кода:

 <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
 </requestedPrivileges>

Параметр level со значением requireAdministrator указывает на то, что нашему приложению для работы требуются права администратора.  Следующими строчками кода мы указываем с какими операционными системами наше приложение будет совместимо:

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!--The ID below indicates application support for Windows Vista -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
      <!--The ID below indicates application support for Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
      <!--The ID below indicates application support for Windows 8 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> 
      <!--The ID below indicates application support for Windows 8.1 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> 
      <!--The ID below indicates application support for Windows 10 --> 
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
    </application>
 </compatibility>

Далее нам необходимо в каталоге проекта создать файл ресурсов компиляции с именем Win7UAC.rc. Содержимое файла компиляции будет следующее:

1 24 "Win7UAC.manifest"

То есть мы в качестве ресурсов нашего приложения указываем наш файл манифеста.

Файл ресурсов компиляции Win7UAC.rc необходимо скомпилировать при помощи компилятора ресурсов brcc32.exe, этот компилятор ресурсов расположен в каталоге, где расположены бинарные файлы Delphi, у меня это каталог D:\Programs\Delphi7\Files\Delphi7\Bin. Убедитесь, что данный каталог добавлен в переменную окружения Path. Запустите командную строку Windows, перейдите в каталог проекта и выполните команду компиляции ресурсов (Смотрите рисунок 2).

Рисунок 2. Запуск компилятора ресурсов

brcc32.exe Win7UAC.rc

В качестве результата в каталоге проекта вы получите файл ресурсов Win7UAC.RES, который необходимо в файле проекта p12.dpr подключить. Смотрите код ниже:

program p12;

uses
  Forms,
  p12_unit1 in 'p12_unit1.pas' {Form1};

{$R 'Win7UAC.RES'}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Вынесите на форму с именем Form1 одну кнопку Button1 и один список ComboBox1 (Смотрите рисунок 3).

 Рисунок 3. Создания формы приложения

Добавьте в свойства Items списка ComboBox1 две строки DOMAIN\User1 и DOMAIN\User2 (Смотрите рисунок 4). Эти строки у нас будут выбираться в ComboBox1. Также поменяйте свойства Style для списка ComboBox1 на csOwnerDraw.

Рисунок 4. Формирование списка ComboBox

Переходим к написанию кода. Рассмотрим обработчик показа формы Form1, это следующий код:

procedure TForm1.FormShow(Sender: TObject);
begin
  Combobox1.ItemIndex := Combobox1.Items.IndexOf('DOMAIN\User1');
end;

В данном обработчике мы присваиваем списку ComboBox1 значение по умолчанию значение DOMAIN\User1. 

Рассмотрим обработчик нажатия кнопки Button1, это следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
  R: TRegistry;
  openResult: Boolean;
const
  SubKey : String = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI';

begin
  strSetRegValue := ComboBox1.Text;
  if (strSetRegValue <> '') then
  begin
    R := TRegistry.Create(KEY_READ);
    R.RootKey := HKEY_LOCAL_MACHINE;
    if (R.KeyExists(SubKey)) then
    begin
      With R do
      begin
        Access := KEY_WRITE OR $0100;
        openResult := OpenKey(SubKey, False);
        if (not openResult = True) Then
        begin
          MessageDlg('Unable to create key! Exiting.', mtError, mbOKCancel, 0);
        end;
        WriteString('LastLoggedOnSAMUser', strSetRegValue);
        WriteString('LastLoggedOnUser', strSetRegValue);

        CloseKey();
        Free;
      end;
    end;
    ShowMessage('Done! Recorded in the registry.');
    strSetRegValue := '';
  end;
end;

В данном обработчике мы указываем путь в реестре Windows куда будем писать значения, это переменная типа String c именем SubKey. Смотрите код:

SubKey : String = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI';

Далее берем выбранное значение ComboBox1 и присваиваем его переменной strSetRegValue. Смотрите код:

strSetRegValue := ComboBox1.Text;

Если переменная strSetRegValue не пуста, то начинаем писать в реестр Windows. Работать будем в корневом разделе HKEY_LOCAL_MACHINE. Смотрите код:

  if (strSetRegValue <> '') then
  begin
    R := TRegistry.Create(KEY_READ);
    R.RootKey := HKEY_LOCAL_MACHINE;


Далее проверяем существует ли путь в реестре SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI. Также открываем подраздел реестра на запись для Windows 7 32 bit и 64 bit, следующая строчка: 

Access := KEY_WRITE OR $0100;


Смотрите следующий код:

if (R.KeyExists(SubKey)) then
    begin
      With R do
      begin
        Access := KEY_WRITE OR $0100;
        openResult := OpenKey(SubKey, False);
        if (not openResult = True) Then
        begin
          MessageDlg('Unable to create key! Exiting.', mtError, mbOKCancel, 0);
        end;


Далее пишем в реестр параметры LastLoggedOnSAMUser, LastLoggedOnUser и закрываем ветку реестра и освобождаем память. Следующие строчки:

        WriteString('LastLoggedOnSAMUser', strSetRegValue);
        WriteString('LastLoggedOnUser', strSetRegValue);

        CloseKey();
        Free;


Ниже показан снимок рабочей программы (Смотрите рисунок 5) и код полностью. При запуске приложения, оно спросит повышения привилегий, если вы имеете права админа (Смотрите рисунок 6) или повышения привилегий путем ввода логина и пароля администратора (Смотрите рисунок 7).

Рисунок 5. Запущенная программа

Рисунок 6. Окно разрешения запуска вашей программы, если вы имеете права администратора

Рисунок 7. Запрос прав администратора, если они у вас отсутствуют

unit p12_unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Registry;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ComboBox1: TComboBox;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  strSetRegValue: String;

procedure TForm1.Button1Click(Sender: TObject);
var
  R: TRegistry;
  openResult: Boolean;
const
  SubKey : String = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI';

begin
  strSetRegValue := ComboBox1.Text;
  if (strSetRegValue <> '') then
  begin
    R := TRegistry.Create(KEY_READ);
    R.RootKey := HKEY_LOCAL_MACHINE;
    if (R.KeyExists(SubKey)) then
    begin
      With R do
      begin
        Access := KEY_WRITE OR $0100;
        openResult := OpenKey(SubKey, False);
        if (not openResult = True) Then
        begin
          MessageDlg('Unable to create key! Exiting.', mtError, mbOKCancel, 0);
        end;
        WriteString('LastLoggedOnSAMUser', strSetRegValue);
        WriteString('LastLoggedOnUser', strSetRegValue);

        CloseKey();
        Free;
      end;
    end;
    ShowMessage('Done! Recorded in the registry.');
    strSetRegValue := '';
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Combobox1.ItemIndex := Combobox1.Items.IndexOf('DOMAIN\User1');
end;

end.