как выполнить эту задачу, описанную в Как создать анонимный канал, который дает доступ каждому
Ошибка ERROR_LOGON_FAILURE
говорит о том, что клиентский код не устанавливает соединение с сетевым ресурсом.действительно нужно вызвать WNetAddConnection2
(или аналоговый API перед вызовом CreateFile
на удаленном канале)
Клиент открывает канал с помощью вызова функции CreateFile
.Если происходит ошибка, клиент проверяет, является ли это ошибкой входа в систему, ошибкой в доступе или ошибкой неверного пароля.Если возникает ошибка, выполните анонимный вход в систему, вызвав функцию WNetAddConnection2
и передав пустую строку в качестве имени пользователя и пароля.Когда нулевой сеанс установлен, клиент снова вызывает функцию CreateFile
.
, поэтому код клиента должен выглядеть так:
NETRESOURCE nr = {};
nr.dwUsage = RESOURCEUSAGE_CONNECTABLE|RESOURCEUSAGE_CONTAINER;
nr.lpRemoteName = L"\\\\server\\IPC$";
WNetAddConnection2W(&nr, L"", L"",0);
HANDLE hFile = CreateFileW(L"\\\\?\\UNC\\server\\PIPE\\MyPipe",
FILE_GENERIC_READ|FILE_GENERIC_WRITE,
0, 0, OPEN_EXISTING, 0, 0);
со стороны сервера должен не только устанавливать 0на месте DACL (это разрешить любой доступ) или разрешить добавление ACE для WinAnonymousSid (это! = WinWorldSid aka каждый ), но также установить ненадежные обязательные метки.это проскальзывает в примере кода, потому что я думаю, что код еще не до конца.
SECURITY_DESCRIPTOR sd;
BOOL fOk = InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION) &&
SetSecurityDescriptorDacl(&sd, TRUE, 0, FALSE);
if (fOk)
{
RTL_OSVERSIONINFOW ovi = { sizeof(ovi) };
if (0 > RtlGetVersion(&ovi))
{
fOk = FALSE;
}
else
{
if (ovi.dwMajorVersion > 5)
{
fOk = FALSE;
ULONG cb = GetSidLengthRequired(1);
PSID UntrustedLabelSid = alloca(cb);
if (CreateWellKnownSid(WinUntrustedLabelSid, 0, UntrustedLabelSid, &cb))
{
PACL Sacl = (PACL)alloca(cb += sizeof(ACL) + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));
fOk = InitializeAcl(Sacl, cb, ACL_REVISION) &&
AddMandatoryAce(Sacl, ACL_REVISION, 0, SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, UntrustedLabelSid) &&
SetSecurityDescriptorSacl(&sd, TRUE, Sacl, FALSE);
}
}
}
}