Как программно включить или отключить совместное использование, защищенное паролем?

Windows Vista и 7 имеют этот переключатель в Центре управления сетями и общим доступом. Он включен по умолчанию, и это предотвращает неаутентифицированный доступ к общим папкам, даже если они открыты для всех (например, к общей папке). Мне нужно научить мое приложение включать и выключать его автоматически. Как? Я подозреваю, что где-то в реестре есть значение, ответственное за это, но я не знаю, как его найти.


person CannibalSmith    schedule 05.11.2009    source источник
comment
Вы хотите разрешить общий доступ, чтобы все, у кого есть доступ к сети, могли читать и записывать файлы в общих папках, которые находятся в Панели управления \ Все элементы панели управления \ Центр управления сетями и общим доступом \ Расширенные настройки общего доступа в Win7?   -  person nick    schedule 14.01.2010
comment
Нет. Я хочу включить / отключить совместное использование, защищенное паролем. Это вторая настройка снизу.   -  person CannibalSmith    schedule 14.01.2010


Ответы (6)


Возможно, уже поздно :), но, надеюсь, полезно для других.

Следующие шаги отлично сработали для меня (они работали и в предварительной версии W8).

чтобы выключить:

1 - Включите гостевую учетную запись, запустив

чистый пользователь гость / активный: да

2 - Получите SID гостевого пользователя, запустив, например,

wmic useraccount, где name = 'guest' получить sid

3 - Получить права записи в папку реестра HKLM \ SECURITY

4 - Измените следующий ключ, где $ SID - это идентификатор безопасности, полученный в пункте 2, на:

[HKEY_LOCAL_MACHINE \ SECURITY \ Policy \ Accounts \ $ SID \ ActSysAc]
@ = шестнадцатеричный (0): 41,00,00,00

5 - перезапустите компьютер (до сих пор я не находил лучшего способа, чтобы изменения вступили в силу)

чтобы снова его включить:

[HKEY_LOCAL_MACHINE \ SECURITY \ Policy \ Accounts \ $ SID \ ActSysAc]
@ = шестнадцатеричный (0): c1,00,00,00

затем перезапустите

person paolo    schedule 20.04.2012
comment
можно написать на cmd, чтобы понять? - person Polyvios P; 05.12.2020

Экспортировать весь регистр как 1.reg, включить совместное использование (или выключить, если он был включен), экспортировать в 2.reg и проверить различия?

Чтобы использовать утилиту diff, экспортируйте файлы в Win9X/NT4 registration files (*.reg) -формат

person Kimvais    schedule 13.01.2010
comment
В файлах отображаются только изменения в MuiCache и MRUListEx (какими бы они ни были) в HKEY_USERS. Обратите внимание: переключатель, который я ищу, является системным и должен находиться в HKEY_LOCAL_MACHINE. - person CannibalSmith; 13.01.2010
comment
Ладно так видимо в реге его нет :( - person Kimvais; 13.01.2010
comment
@CannibalSmith: MRUListEx предназначен для недавно использованных элементов (MRU), поэтому они будут отображаться выше в списках, содержащих элементы, которые вы недавно использовали. - person John Feminella; 19.01.2010
comment
Было бы проще использовать Process Monitor. - person XP1; 22.04.2012

Вот сценарий PowerShell, который реализует ответ paolos. Он не доработан, поскольку разрешает всем доступ на запись к определенному ключу реестра (часть [7] указывает это с помощью синтаксиса regini) и использует файл в C: \ root, но работает безупречно:

# Get guest user id
$SID = & "wmic" "useraccount" "where" "name='guest'" "get" "sid" "/Value" | Out-String
$SID = $SID.Trim().Substring(4)

# Generate regini script
$PATH = "\Registry\Machine\Security\Policy\Accounts\" + $SID + "\ActSysAc"
$PATH + " [7]`r`n" + $PATH + "`r`n@ = REG_NONE 4 0x41 0x00 0x00 0x00" >> "C:\firstrun.regini"

# Execute regini script
& "regini" "C:\firstrun.regini"
person PaulFreund    schedule 11.03.2015
comment
Работает на месте - на Windows Server 2016. Однако для включения требуется перезагрузка. - person Luke; 12.09.2018

Он находится в реестре, но не обязательно в том месте, где вы ожидаете (он находится в SAM). Насколько я могу судить, все, что делает этот параметр, - это включение или отключение гостевой учетной записи, так что просто включите или отключите учетную запись.

Вы не сказали, какой язык программирования вы используете, поэтому вот простой код C для включения учетной записи, если вам что-то еще нужно, я уверен, что через Google есть много возможностей.

#include <LM.h>
#pragma comment(lib, "Netapi32.lib")

BOOL EnableUser(LPCWSTR lpUserName, BOOL bEnable)
{
    BOOL bRet = FALSE;
    DWORD dwLevel = 1008;
    LPUSER_INFO_1 ui1;
    USER_INFO_1008 ui1008;
    NET_API_STATUS nStatus;

    nStatus = NetUserGetInfo(NULL, lpUserName, 1, (LPBYTE*)&ui1);
    if(nStatus == NERR_Success)
    {
        ui1008.usri1008_flags = ui1->usri1_flags;
        if(bEnable)
        {
            ui1008.usri1008_flags &= ~UF_ACCOUNTDISABLE;
        }
        else
        {
            ui1008.usri1008_flags |= UF_ACCOUNTDISABLE;
        }

        nStatus = NetUserSetInfo(NULL, lpUserName,  dwLevel, (LPBYTE)&ui1008, NULL);
        NetApiBufferFree(ui1);
        if(nStatus == NERR_Success)
        {
            bRet = TRUE;
        }   
    }

    return bRet;
}
person tyranid    schedule 13.01.2010
comment
Ваш код не отключает доступ, защищенный паролем, и не включает гостевую учетную запись. Я прошел через него, чтобы убедиться, что все вызовы API возвращают 0. Кроме того, включение гостевой учетной записи вручную через панель управления не влияет на совместное использование, защищенное паролем. - person CannibalSmith; 18.01.2010

Я безуспешно тестировал ответ Паоло на Windows 7 Home. Сравнивая .reg извлечение реестра до и после отключения совместного доступа, защищенного паролем, я заметил изменения в 3 значениях:

Первый байт значения [HKEY_LOCAL_MACHINE\SECURITY\Policy\Accounts\S-1-5-21-3207962671-1026919178-1165869658-501\ActSysAc] REG_NONE изменен с c1 на 41 (этот SID является SID гостевой учетной записи)

17-й байт значения [HKEY_LOCAL_MACHINE\SECURITY\SAM\Domains\Account] REG_BINARY "F" изменен с 3b на 3c

57-й байт значения [HKEY_LOCAL_MACHINE\SECURITY\SAM\Domains\Account\Users\000001F5] REG_BINARY "F" изменен с 15 на 14 (0x1F5 - это тип значения имени гостя)

Я попытался изменить только первое значение, указанное Паоло. Это не изменило защищенный паролем общий доступ даже после перезагрузки. Но мне удалось изменить 57-й байт между 14 и 15 только для третьего значения:

[HKEY_LOCAL_MACHINE\SECURITY\SAM\Domains\Account\Users\000001F5] REG_BINARY "F".

Я успешно протестировал на другом компьютере с Windows 7.

person Arnaud    schedule 15.09.2017

Взгляните на этот файл (disable_password_protected_sharing.bat)

@echo off
echo 12- get sid gust variable
for /f "delims= " %%a in ('"wmic useraccount where name='guest' get sid"') do (
       if not "%%a"=="SID" (          
          set sid_guest=%%a
          goto :loop_end
       )   
    )

:loop_end

echo 13- create script for regini
@echo \Registry\Machine\SECURITY [1 5 7 11 17 21]> x
@echo \Registry\Machine\SECURITY\policy [1 5 7 11 17 21]>> x
@echo \Registry\Machine\SECURITY\policy\accounts [1 5 7 11 17 21]>> x
@echo \Registry\Machine\SECURITY\policy\accounts\%sid_guest% [1 5 7 11 17 21]>> x
@echo \Registry\Machine\SECURITY\policy\accounts\%sid_guest%\ActSysAc [1 5 7 11 17 21]>> x

echo 14- add permission for machine/security
net user guest /active:yes
regini x
del x
@echo Windows Registry Editor Version 5.00 > y.reg
@echo [HKEY_LOCAL_MACHINE\SECURITY\Policy\Accounts\%sid_guest%\ActSysAc] >> y.reg
@echo @=hex(0):41,00,00,00 >> y.reg
reg import y.reg
del y.reg

echo Windows will now reboot.
Pause

shutdown -r

он отлично работает в windows7

person Mohammed Said    schedule 30.07.2016