在Windows操作系统中,系统服务(Services)、计划任务(Scheduled Tasks)以及很多系统调用都是以SYSTEM系统账号进行操作的。如果在阿里云ECS用 net use 挂载,或者在文件管理器上直接挂载,挂载卷是以 Administrator 身份进行挂载的,而 SYSTEM 账号无法使用 Administrator 挂载的文件卷。
关于SYSTEM账号的更多内容请参考 How the SYSTEM account is used in Windows[1] 以及 SYSTEM account in Windows[2]。
SYSTEM账号能解决的NAS SMB场景
1. IIS日志写入
如果没有配置SYSTEM挂载,会出现写入错误。
按照以下SYSTEM账号挂载方式完成挂载时候,IIS日志可以写入成功。日志写入成功之后会生成W3SVC1的日志文件夹以及日志文件。
2. 某些服务(Services)无法启动
比如如果一个服务(Service)里面调用了文件卷里的执行程序,如果文件卷不是以 SYSTEM 身份挂载的,则服务无法执行,会返回程序无法加载。采用上述的 SYSTEM 身份挂载解决方案就可以让服务启动了。
在碰到依赖文件卷的系统程序无法执行,并且抓包没有明显错误时,问题很可能出在卷需要用 SYSTEM 账号挂载,可以优先尝试上述的解决方案。
使用脚本自动完成SYSTEM账号挂载NAS SMB卷
在Powershell或者Powershell ISE中运行以下命令下载并运行挂载排查脚本。
Invoke-WebRequest https://code.aliyun.com/nas_team/nas-client-tools/raw/master/windows_client/alinas_smb_windows_inspection.ps1 -OutFile alinas_smb_windows_inspection.ps1
.\alinas_smb_windows_inspection.ps1 -MountAddress abcde-123.region-id.nas.aliyuncs.com -SystemMount $true -Locale zh-CN
对于Windows Server 2016或者以上版本,挂载时需要身份。可以使用以下参数完成SYSTEM账号挂载。
.\alinas_smb_windows_inspection.ps1 -MountAddress abcde-123.region-id.nas.aliyuncs.com -SystemMount $true -Username administrator -Password admin_password -Locale zh-CN
手动完成SYSTEM账号挂载NAS SMB卷
1. 参考 Map network drive for the SYSTEM user in Windows[3] ,我们建立
c:\my_mount.bat 脚本,内容如下:
ECHO ON
ECHO This will map the drive, but is being run by task scheduler AS the user SYSTEM
ECHO which should make it accessible to the user SYSTEM
ECHO List the existing drives first.
net use >> c:\SystemNetUseOutput.txt
net use y: \\xxx.nas.aliyuncs.com\myshare
ECHO List the existing drives with the new mapping
net use >> c:\SystemNetUseOutput.txt
ECHO See what user this batch job ran under
whoami >> c:\SystemNetUseOutput.txt
ECHO need to exit to allow the job to finish
EXIT
将脚本中的xxx改为您的卷挂载点。以上脚本会挂载NAS SMB卷,并且会输出是以何种身份挂载。
2. 可以在命令行运行以下命令生成 my_mount 任务并运行该任务
schtasks /create /tn "my_mount" /tr "c:\my_mount.bat" /sc onstart /RU SYSTEM /RL HIGHEST
schtasks /run /tn "my_mount"
3. 运行完之后的结果
在 C:\SystemNetUseOutput.txt 中应该能看到类似这样的结果
New connections will be remembered.
There are no entries in the list.
New connections will be remembered.
Status Local Remote Network
OK y: \\xxx.nas.aliyuncs.com\myshare Microsoft Windows Network
The command completed successfully.
nt authority\system
挂载成功后文件管理器会显示类似这样的文件卷:
4. Windows Server 2016 及以上版本的注意事项
Windows Server 2016 及以上版本客户端不允许匿名访问。用户可以使用workshop\administrator身份进行挂载。
将1.中的脚本改为:
ECHO ON
ECHO This will map the drive, but is being run by task scheduler AS the user SYSTEM
ECHO which should make it accessible to the user SYSTEM
ECHO List the existing drives first.
net use >> c:\SystemNetUseOutput.txt
net use y: \\xxx.nas.aliyuncs.com\myshare /user:WORKGROUP\administrator PASSWORD
ECHO List the existing drives with the new mapping
net use >> c:\SystemNetUseOutput.txt
ECHO See what user this batch job ran under
whoami >> c:\SystemNetUseOutput.txt
ECHO need to exit to allow the job to finish
EXIT
其他步骤相同。
5. 也可以使用图形界面生成 my_mount 任务并运行该任务
5.1. 打开任务计划程序
5.2. 点击创建基本任务,写入任务名 my_mount
5.3. 点击下一步,选择 计算机启动时
5.4. 选择 启动程序
5.5. 程序或脚本写入:C:\my_mount.bat
5.6. 点击下一步,点击完成
5.7. 在活动任务中找到 my_mount
5.8. 双击进入,选择 运行
6. 运行完之后的结果
在 C:\SystemNetUseOutput.txt 中应该能看到类似这样的结果
New connections will be remembered.
There are no entries in the list.
New connections will be remembered.
Status Local Remote Network
OK y: \\xxx.nas.aliyuncs.com\myshare Microsoft Windows Network
The command completed successfully.
nt authority\system
挂载成功后文件管理器会显示类似这样的文件卷:
7. Windows Server 2016 及以上版本的注意事项(同1.4.)
Windows Server 2016 及以上版本客户端不允许匿名访问。用户可以在本地创建一个专门用来挂载的用户,比如 mount_user。
将1.中的脚本改为:
ECHO ON
ECHO This will map the drive, but is being run by task scheduler AS the user SYSTEM
ECHO which should make it accessible to the user SYSTEM
ECHO List the existing drives first.
net use >> c:\SystemNetUseOutput.txt
net use y: \\xxx.nas.aliyuncs.com\myshare /user:WORKGROUP\administrator PASSWORD
ECHO the /P switch makes the drive remain after reboot
ECHO List the existing drives with the new mapping
net use >> c:\SystemNetUseOutput.txt
ECHO See what user this batch job ran under
whoami >> c:\SystemNetUseOutput.txt
ECHO need to exit to allow the job to finish
EXIT
总结
在碰到依赖文件卷的系统程序无法执行,并且抓包没有明显错误时,问题可能出在卷需要用 SYSTEM 账号挂载,可以优先尝试上述的解决方案。