【问题标题】:How do I turn Password Protected Sharing on or off programmatically?如何以编程方式打开或关闭受密码保护的共享?
【发布时间】:2010-12-13 13:37:02
【问题描述】:

Windows Vista 和 7 在网络和共享中心有这个开关。默认情况下它处于打开状态,即使共享与所有人共享(如公共文件夹),也可以防止未经身份验证的访问。我需要教我的应用程序自动打开和关闭它。如何? 我怀疑注册表中的某个值对此负责,但我不知道如何找到它。

【问题讨论】:

  • 您是否要在“控制面板\所有控制面板项目\网络和共享中心\高级共享设置”中启用“共享,以便具有网络访问权限的每个人都可以读取和写入公用文件夹中的文件” " 在 Win7 上?
  • 没有。我想启用/禁用受密码保护的共享。这是倒数第二个设置。

标签: windows-7 windows-vista


【解决方案1】:

可能为时已晚 :) ,但希望对其他人有用。

以下步骤对我来说效果很好(它也适用于 W8 消费者预览版)。

关闭它:

1 - 通过运行启用访客帐户

net user guest /active:yes

2 - 通过运行获取来宾用户 SID,例如,

wmic useraccount where name='guest' get sid

3 - 获得对注册表文件夹 HKLM\SECURITY 的写入权限

4 - 将以下键修改为:

[HKEY_LOCAL_MACHINE\SECURITY\Policy\Accounts\$SID\ActSysAc]
@=hex(0):41,00,00,00

5 - 重新启动机器(直到现在,我还没有找到更好的方法来使更改生效)

再次开启:

[HKEY_LOCAL_MACHINE\SECURITY\Policy\Accounts\$SID\ActSysAc]
@=hex(0):c1,00,00,00

然后重启

【讨论】:

  • 能不能写在cmd上看懂?
【解决方案2】:

将完整的寄存器导出为 1.reg,打开共享(或关闭,如果已打开),导出到 2.reg 并检查差异?

为了能够使用diff 实用程序,请以Win9X/NT4 registration files (*.reg) 格式导出文件

【讨论】:

  • 这些文件仅显示 HKEY_USERS 中的 MuiCache 和 MRUListEx(无论是什么)的变化。请注意,我正在寻找的开关是系统范围的,应该在 HKEY_LOCAL_MACHINE 中。
  • 好的,显然它不在 reg 中 :(
  • @CannibalSmith:MRUListEx 用于“最近使用 (MRU)”项目,因此它们会在包含您最近使用的项目的列表中显示得更高。
  • 只使用进程监视器会更容易。
【解决方案3】:

这是一个实现 paolos answer 的 powershell 脚本。它是未经修饰的,因为它允许每个人对特定注册表项进行写访问([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"

【讨论】:

  • 可以在 Windows Server 2016 上正常工作。但需要重新启动才能启用。
【解决方案4】:

它在注册表中,但不一定在您期望的位置(它在 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;
}

【讨论】:

  • 您的代码既不会禁用受密码保护的共享,也不会启用访客帐户。我逐步检查以确保所有 API 调用都返回 0。此外,通过控制面板手动启用访客帐户不会影响受密码保护的共享。
【解决方案5】:

我在 Windows 7 Home 上测试了 Paolo 的答案,但没有成功。 比较关闭密码保护共享前后注册表的.reg提取,我注意到3个值的修改:

[HKEY_LOCAL_MACHINE\SECURITY\Policy\Accounts\S-1-5-21-3207962671-1026919178-1165869658-501\ActSysAc] REG_NONE 值的第一个字节从 c1 更改为 41(此 SID 是访客帐户的 SID)

[HKEY_LOCAL_MACHINE\SECURITY\SAM\Domains\Account] REG_BINARY "F" 值的第 17 个字节从 3b 更改为 3c

[HKEY_LOCAL_MACHINE\SECURITY\SAM\Domains\Account\Users\000001F5] REG_BINARY "F" 值的第 57 字节从 15 更改为 140x1F5 是访客名称值的类型)

我尝试只更改 Paolo 指示的第一个值。即使在重新启动后,这也不会更改受密码保护的共享。 但是我在 1415 之间更改第 57 个字节时只为第三个值成功:

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

我在另一台 Windows 7 计算机上测试成功。

【讨论】:

    【解决方案6】:

    看看这个文件 (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下可以正常使用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-08
      • 2013-12-11
      • 2021-03-28
      • 2021-12-01
      • 1970-01-01
      • 2016-04-01
      • 2016-06-25
      • 1970-01-01
      相关资源
      最近更新 更多