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

时间:2009-11-05 19:26:41

标签: windows-7 windows-vista

Windows Vista和7在网络和共享中心中具有此开关。它默认处于启用状态,即使它们与Everyone共享(如Public文件夹),也会阻止对共享进行未经身份验证的访问。我需要教我的应用程序自动打开和关闭它。怎么样? 我怀疑注册表中有一个值对此负责,但我不知道如何找到它。

6 个答案:

答案 0 :(得分:3)

可能太晚了:),但希望对其他人有用。

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

将其关闭:

1 - 运行

启用访客帐户
  

net user guest / active:yes

2 - 通过运行

来获取访客用户SID
  

wmic useraccount其中name ='guest'获取sid

3 - 获取对注册表文件夹HKLM \ SECURITY

的写入权限

4 - 将以下密钥修改为:

,其中$ SID是第2点中获得的sid
  

[HKEY_LOCAL_MACHINE \ SECURITY \策略\帐户\ $ SID \ ActSysAc]
  @ =十六进制(0):41,00,00,00

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

再次打开它:

  

[HKEY_LOCAL_MACHINE \ SECURITY \策略\帐户\ $ SID \ ActSysAc]
  @ =十六进制(0):c1,00,00,00

然后重启

答案 1 :(得分:1)

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

为了能够使用diff实用程序,请导出Win9X/NT4 registration files (*.reg) -format

中的文件

答案 2 :(得分:1)

这是一个实现paolos答案的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"

答案 3 :(得分:0)

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

答案 4 :(得分:0)

看看这个文件(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中工作正常

答案 5 :(得分:0)

我在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计算机上测试成功。