Windows Vista и 7 имеют этот переключатель в Центре управления сетями и общим доступом. Он включен по умолчанию, и это предотвращает неаутентифицированный доступ к общим папкам, даже если они открыты для всех (например, к общей папке). Мне нужно научить мое приложение включать и выключать его автоматически. Как? Я подозреваю, что где-то в реестре есть значение, ответственное за это, но я не знаю, как его найти.
Как программно включить или отключить совместное использование, защищенное паролем?
Ответы (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
затем перезапустите
Экспортировать весь регистр как 1.reg, включить совместное использование (или выключить, если он был включен), экспортировать в 2.reg и проверить различия?
Чтобы использовать утилиту diff, экспортируйте файлы в Win9X/NT4 registration files (*.reg) -формат
Вот сценарий 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"
Он находится в реестре, но не обязательно в том месте, где вы ожидаете (он находится в 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;
}
Я безуспешно тестировал ответ Паоло на 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.
Взгляните на этот файл (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