Windows 7 如何以编程方式打开或关闭受密码保护的共享?

Windows 7 如何以编程方式打开或关闭受密码保护的共享?,windows-7,windows-vista,Windows 7,Windows Vista,Windows Vista和7在网络和共享中心中有此交换机。默认情况下,它处于启用状态,这将阻止未经验证的访问共享,即使这些共享是与所有人共享的(如公用文件夹)。我需要教我的应用程序自动打开和关闭。怎么用?我怀疑注册表中的某个值导致了这种情况,但我不知道如何找到它。将完整的注册表导出为1.reg,打开共享(或关闭,如果打开),导出到2.reg并检查差异 要能够使用diff实用程序,请导出Win9X/NT4注册文件(*.reg)-format中的文件,它位于注册表中,但不一定位于您期望的位置(位于

Windows Vista和7在网络和共享中心中有此交换机。默认情况下,它处于启用状态,这将阻止未经验证的访问共享,即使这些共享是与所有人共享的(如公用文件夹)。我需要教我的应用程序自动打开和关闭。怎么用?我怀疑注册表中的某个值导致了这种情况,但我不知道如何找到它。

将完整的注册表导出为1.reg,打开共享(或关闭,如果打开),导出到2.reg并检查差异


要能够使用
diff
实用程序,请导出
Win9X/NT4注册文件(*.reg)
-format

中的文件,它位于注册表中,但不一定位于您期望的位置(位于SAM中)。从我可以看出,设置所做的只是启用或禁用来宾帐户,所以,好吧,只需启用或禁用帐户即可

你没有说你正在使用什么编程语言,所以这里有一些简单的C代码来启用一个帐户,如果你还需要什么,我相信通过谷歌有很多

#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;
}
#包括
#pragma注释(lib,“Netapi32.lib”)
BOOL启用用户(LPCWSTR lpUserName,BOOL bEnable)
{
布尔-布雷特=假;
DWORD dwLevel=1008;
LPUSER_INFO_1 ui1;
用户信息1008 ui1008;
网络状态;
nStatus=NetUserGetInfo(NULL,lpUserName,1,(LPBYTE*)&ui1);
如果(nStatus==NERR_Success)
{
ui1008.usri1008_flags=ui1->usri1_flags;
如果(可弯曲)
{
ui1008.usri1008_标志&=~UF_ACCOUNTDISABLE;
}
其他的
{
ui1008.usri1008|U标志|=UF|U账户禁用;
}
nStatus=NetUserSetInfo(NULL,lpUserName,dwLevel,(LPBYTE)和ui1008,NULL);
NetApiBufferFree(ui1);
如果(nStatus==NERR_Success)
{
bRet=真;
}   
}
返回布雷特;
}
可能太晚了:),但希望对其他人有用

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

要关闭它,请执行以下操作:

1-通过运行

净用户来宾/活动:是

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

wmic用户帐户,其中name='guest'获取sid

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

4-将以下键(其中$SID是在第2点中获得的SID)修改为:

[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


然后重新启动

这是一个实现paolos应答的powershell脚本。它是未抛光的,因为它允许每个人对特定注册表项进行写访问([7]部分使用regini语法指定了这一点),并使用C:\root中的文件,但工作正常:

#获取来宾用户id
$SID=&“wmic”“useraccount”“其中”“name='guest'”获取“SID”“/Value”|输出字符串
$SID=$SID.Trim().Substring(4)
#生成regini脚本
$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”
#执行regini脚本
&“regini”“C:\firstrun.regini”
查看此文件(禁用受密码保护的共享.bat)


它在windows7上运行良好

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

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

[HKEY\U LOCAL\U MACHINE\SAM\Domains\Account]REG\u二进制“F”
值的第17个字节从
3b
更改为
3c

[HKEY\U LOCAL\U MACHINE\SAM\Domains\Account\Users\000001F5]REG\u二进制“F”
值的第57个字节从
15
更改为
14
0x1F5
是来宾姓名值的类型)

我试着只改变保罗指示的第一个值。即使在重新启动后,这也不会更改受密码保护的共享。 但我成功地将第57个字节在
14
15
之间更改为第三个值:

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

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

这些文件仅显示HKEY_用户中MuiCache和MRUListEx(无论是什么)的更改。请注意,我正在查找的交换机是系统范围的,应该在HKEY_LOCAL_MACHINE中。好的,因此显然它不在注册表中:(@CannibalSmith:MRUListEx用于“最近使用的(MRU)”项,因此它们将在包含您最近使用的内容的列表中显示得更高。只使用进程监视器会更容易。是否要启用在“控制面板\所有控制面板项目\网络和共享中心\高级共享设置”中找到“共享,以便具有网络访问权限的每个人都可以读取和写入公用文件夹中的文件”"在Win7上?否。我想启用/禁用受密码保护的共享。这是从底部开始的第二个设置。您的代码既不禁用受密码保护的共享,也不启用来宾帐户。我仔细检查了它,以确保所有API调用返回0。此外,通过控制面板手动启用来宾帐户不会影响受密码保护的共享aring.在Windows Server 2016上现场工作。需要重新启动才能启用。您能将其写入cmd以理解吗?
[HKEY_LOCAL_MACHINE\SECURITY\SAM\Domains\Account\Users\000001F5] REG_BINARY "F".